From: thiery Date: Tue, 20 Jun 2006 09:55:46 +0000 (+0000) Subject: Implement functions SD_workstation_route_get_list, SD_workstation_route_get_size... X-Git-Tag: v3.3~2952 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/8750e7f378b5d48477e1b0b2796a437366a3ea2b Implement functions SD_workstation_route_get_list, SD_workstation_route_get_size, SD_link_get_name, SD_link_get_bandwidth and SD_link_get_latency. Add functions in Surf to access those information. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2406 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/simdag/datatypes.h b/include/simdag/datatypes.h index 78b64b67db..f7d3299308 100644 --- a/include/simdag/datatypes.h +++ b/include/simdag/datatypes.h @@ -7,8 +7,8 @@ typedef struct SD_link_data *SD_link_data_t; typedef struct SD_link { SD_link_data_t sd_data; /* SD internal data */ void *data; /* user data */ - char *name; + /*char *name;*/ /*double capacity;*/ /*double current_bandwidth; double current_latency;*/ diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 893a87ef04..388701189e 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -131,6 +131,10 @@ typedef struct surf_network_resource_extension_public { surf_action_t(*communicate) (void *src, void *dst, double size, double max_rate); const void** (*get_route) (void *src, void *dst); + int (*get_route_size) (void *src, void *dst); + const char* (*get_link_name) (const void *link); + double (*get_link_bandwidth) (const void *link); + double (*get_link_latency) (const void *link); } s_surf_network_resource_extension_public_t, *surf_network_resource_extension_public_t; @@ -161,6 +165,10 @@ typedef struct surf_workstation_resource_extension_public { double amount, double rate); const void** (*get_route) (void *src, void *dst); + int (*get_route_size) (void *src, void *dst); + const char* (*get_link_name) (const void *link); + double (*get_link_bandwidth) (const void *link); + double (*get_link_latency) (const void *link); } s_surf_workstation_resource_extension_public_t, *surf_workstation_resource_extension_public_t; diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index bf190c0449..52c35d5395 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -37,7 +37,7 @@ void SD_create_environment(const char *platform_file) { printf("surf_network_resource = %p, network_link_set = %p\n", surf_network_resource, network_link_set);*/ surf_workstation_resource_init_KCCFLN05(platform_file); - /* surf_workstation_resource_init_CLM03(platform_file);*/ + /*surf_workstation_resource_init_CLM03(platform_file);*/ /*printf("surf_workstation_resource = %p, workstation_set = %p\n", surf_workstation_resource, workstation_set); printf("surf_network_resource = %p, network_link_set = %p\n", surf_network_resource, network_link_set);*/ @@ -63,11 +63,11 @@ SD_task_t* SD_simulate(double how_long) xbt_dict_cursor_t cursor = NULL; char *name = NULL; SD_workstation_t workstation = NULL; - double power, available_power; + double power, available_power, bandwidth, latency; SD_link_t link = NULL; surf_solve(); - + xbt_dict_foreach(sd_global->workstations, cursor, name, workstation) { power = SD_workstation_get_power(workstation); available_power = SD_workstation_get_available_power(workstation); @@ -75,8 +75,28 @@ SD_task_t* SD_simulate(double how_long) } xbt_dict_foreach(sd_global->links, cursor, name, link) { - printf("Link name: %s\n", name); + bandwidth = SD_link_get_current_bandwidth(link); + latency = SD_link_get_current_latency(link); + printf("Link name: %s, bandwidth: %f, latency; %f\n", name, bandwidth, latency); + } + + /* test the route between two workstations */ + SD_workstation_t src, dst; + xbt_dict_cursor_first(sd_global->workstations, &cursor); + xbt_dict_cursor_get_or_free(&cursor, &name, (void**) &src); + xbt_dict_cursor_step(cursor); + xbt_dict_cursor_get_or_free(&cursor, &name, (void**) &dst); + xbt_dict_cursor_free(&cursor); + + SD_link_t *route = SD_workstation_route_get_list(src, dst); + int route_size = SD_workstation_route_get_size(src, dst); + + printf("Route between %s and %s (%d links) : ", SD_workstation_get_name(src), SD_workstation_get_name(dst), route_size); + int i; + for (i = 0; i < route_size; i++) { + printf("%s ", SD_link_get_name(route[i])); } + printf("\n"); return NULL; } diff --git a/src/simdag/sd_link.c b/src/simdag/sd_link.c index dc3076ed3a..89eed1065f 100644 --- a/src/simdag/sd_link.c +++ b/src/simdag/sd_link.c @@ -67,10 +67,7 @@ double SD_link_get_capacity(SD_link_t link) { double SD_link_get_current_bandwidth(SD_link_t link) { CHECK_INIT_DONE(); xbt_assert0(link != NULL, "Invalid parameter"); - - /* TODO */ - return 0; - /* return link->current_bandwidth;*/ + return surf_workstation_resource->extension_public->get_link_bandwidth(link->sd_data->surf_link); } /* Return the current latency of a link. @@ -78,10 +75,7 @@ double SD_link_get_current_bandwidth(SD_link_t link) { double SD_link_get_current_latency(SD_link_t link) { CHECK_INIT_DONE(); xbt_assert0(link != NULL, "Invalid parameter"); - - /* TODO */ - return 0; - /* return link->current_latency;*/ + return surf_workstation_resource->extension_public->get_link_latency(link->sd_data->surf_link); } /* Destroys a link. The user data (if any) should have been destroyed first. diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index 5c25338872..ed3b9fb98f 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -85,16 +85,34 @@ const char* SD_workstation_get_name(SD_workstation_t workstation) { return surf_workstation_resource->common_public->get_resource_name(workstation->sd_data->surf_workstation); } +/* Returns an new array of links representating the route between two workstations. + */ SD_link_t* SD_workstation_route_get_list(SD_workstation_t src, SD_workstation_t dst) { CHECK_INIT_DONE(); - /* TODO */ - return NULL; + + void *surf_src = src->sd_data->surf_workstation; + void *surf_dst = dst->sd_data->surf_workstation; + + const void **surf_route = surf_workstation_resource->extension_public->get_route(surf_src, surf_dst); + int route_size = surf_workstation_resource->extension_public->get_route_size(surf_src, surf_dst); + + SD_link_t* route = xbt_new0(SD_link_t, route_size); + const char *link_name; + int i; + for (i = 0; i < route_size; i++) { + link_name = surf_workstation_resource->extension_public->get_link_name(surf_route[i]); + route[i] = xbt_dict_get(sd_global->links, link_name); + } + + return route; } +/* Returns the number of links on the route between two workstations. + */ int SD_workstation_route_get_size(SD_workstation_t src, SD_workstation_t dst) { CHECK_INIT_DONE(); - /* TODO */ - return 0; + return surf_workstation_resource->extension_public-> + get_route_size(src->sd_data->surf_workstation, dst->sd_data->surf_workstation); } /* Returns the total power of a workstation. diff --git a/src/surf/network.c b/src/surf/network.c index 99b301fe6a..5fa36951cf 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -458,10 +458,29 @@ static surf_action_t communicate(void *src, void *dst, double size, double rate) return (surf_action_t) action; } +/* returns an array of network_link_CM02_t */ static const void** get_route(void *src, void *dst) { - /* TODO */ + network_card_CM02_t card_src = src; + network_card_CM02_t card_dst = dst; + return (const void**) ROUTE(card_src->id, card_dst->id); +} + +static int get_route_size(void *src, void *dst) { + network_card_CM02_t card_src = src; + network_card_CM02_t card_dst = dst; + return ROUTE_SIZE(card_src->id, card_dst->id); +} + +static const char *get_link_name(const void *link) { + return ((network_link_CM02_t) link)->name; +} + +static double get_link_bandwidth(const void *link) { + return ((network_link_CM02_t) link)->bw_current; +} - return NULL; +static double get_link_latency(const void *link) { + return ((network_link_CM02_t) link)->lat_current; } static void action_suspend(surf_action_t action) @@ -572,6 +591,10 @@ static void surf_network_resource_init_internal(void) surf_network_resource->extension_public->communicate = communicate; surf_network_resource->extension_public->get_route = get_route; + surf_network_resource->extension_public->get_route_size = get_route_size; + surf_network_resource->extension_public->get_link_name = get_link_name; + surf_network_resource->extension_public->get_link_bandwidth = get_link_bandwidth; + surf_network_resource->extension_public->get_link_latency = get_link_latency; network_link_set = xbt_dict_new(); network_card_set = xbt_dict_new(); diff --git a/src/surf/network_dassf.c b/src/surf/network_dassf.c index 1a4651f2d6..771898e495 100644 --- a/src/surf/network_dassf.c +++ b/src/surf/network_dassf.c @@ -410,10 +410,29 @@ static surf_action_t communicate(void *src, void *dst, double size, double rate) return (surf_action_t) action; } +/* returns a NULL-terminated array of network_link_DASSF_t */ static const void** get_route(void *src, void *dst) { - /* TODO */ + network_card_DASSF_t card_src = src; + network_card_DASSF_t card_dst = dst; + return (const void**) ROUTE(card_src->id, card_dst->id); +} + +static int get_route_size(void *src, void *dst) { + network_card_DASSF_t card_src = src; + network_card_DASSF_t card_dst = dst; + return ROUTE_SIZE(card_src->id, card_dst->id); +} + +static const char *get_link_name(const void *link) { + return ((network_link_DASSF_t) link)->name; +} + +static double get_link_bandwidth(const void *link) { + return ((network_link_DASSF_t) link)->bw_current; +} - return NULL; +static double get_link_latency(const void *link) { + return ((network_link_DASSF_t) link)->lat_current; } static void action_suspend(surf_action_t action) @@ -515,6 +534,10 @@ static void surf_network_resource_init_internal(void) surf_network_resource->extension_public->communicate = communicate; surf_network_resource->extension_public->get_route = get_route; + surf_network_resource->extension_public->get_route_size = get_route_size; + surf_network_resource->extension_public->get_link_name = get_link_name; + surf_network_resource->extension_public->get_link_bandwidth = get_link_bandwidth; + surf_network_resource->extension_public->get_link_latency = get_link_latency; network_link_set = xbt_dict_new(); network_card_set = xbt_dict_new(); diff --git a/src/surf/workstation.c b/src/surf/workstation.c index f55900372f..5d6120c3f0 100644 --- a/src/surf/workstation.c +++ b/src/surf/workstation.c @@ -387,10 +387,29 @@ static surf_action_t execute_parallel_task (int workstation_nb, return (surf_action_t) action; } +/* returns an array of network_link_CM02_t */ static const void** get_route(void *src, void *dst) { - /* TODO */ + workstation_CLM03_t workstation_src = (workstation_CLM03_t) src; + workstation_CLM03_t workstation_dst = (workstation_CLM03_t) dst; + return surf_network_resource->extension_public->get_route(workstation_src->network_card, workstation_dst->network_card); +} + +static int get_route_size(void *src, void *dst) { + workstation_CLM03_t workstation_src = (workstation_CLM03_t) src; + workstation_CLM03_t workstation_dst = (workstation_CLM03_t) dst; + return surf_network_resource->extension_public->get_route_size(workstation_src->network_card, workstation_dst->network_card); +} + +static const char *get_link_name(const void *link) { + return surf_network_resource->extension_public->get_link_name(link); +} + +static double get_link_bandwidth(const void *link) { + return surf_network_resource->extension_public->get_link_bandwidth(link); +} - return NULL; +static double get_link_latency(const void *link) { + return surf_network_resource->extension_public->get_link_latency(link); } static void finalize(void) @@ -473,7 +492,10 @@ static void surf_workstation_resource_init_internal(void) surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task; surf_workstation_resource->extension_public->get_route = get_route; - + surf_workstation_resource->extension_public->get_route_size = get_route_size; + surf_workstation_resource->extension_public->get_link_name = get_link_name; + surf_workstation_resource->extension_public->get_link_bandwidth = get_link_bandwidth; + surf_workstation_resource->extension_public->get_link_latency = get_link_latency; workstation_set = xbt_dict_new(); xbt_assert0(maxmin_system, "surf_init has to be called first!"); diff --git a/src/surf/workstation_KCCFLN05.c b/src/surf/workstation_KCCFLN05.c index c91ad04542..d3d78ce8d5 100644 --- a/src/surf/workstation_KCCFLN05.c +++ b/src/surf/workstation_KCCFLN05.c @@ -560,20 +560,34 @@ static surf_action_t execute_parallel_task(int cpu_nb, return NULL; } -/* returns a NULL-terminated array of network_link_KCCFLN05_t */ +/* returns an array of network_link_KCCFLN05_t */ static const void** get_route(void *src, void *dst) { cpu_KCCFLN05_t card_src = src; cpu_KCCFLN05_t card_dst = dst; route_KCCFLN05_t route = &(ROUTE(card_src->id, card_dst->id)); - int route_size = route->size; - - /* add NULL at the end of the array if not present */ - route->links = xbt_realloc(route->links, (route_size+1) * sizeof(route_KCCFLN05_t)); - route->links[route_size] = NULL; return (const void**) route->links; } +static int get_route_size(void *src, void *dst) { + cpu_KCCFLN05_t card_src = src; + cpu_KCCFLN05_t card_dst = dst; + route_KCCFLN05_t route = &(ROUTE(card_src->id, card_dst->id)); + return route->size; +} + +static const char *get_link_name(const void *link) { + return ((network_link_KCCFLN05_t) link)->name; +} + +static double get_link_bandwidth(const void *link) { + return ((network_link_KCCFLN05_t) link)->bw_current; +} + +static double get_link_latency(const void *link) { + return ((network_link_KCCFLN05_t) link)->lat_current; +} + /**************************************/ /*** Resource Creation & Destruction **/ /**************************************/ @@ -924,6 +938,10 @@ static void resource_init_internal(void) surf_workstation_resource->extension_public->communicate = communicate; surf_workstation_resource->extension_public->execute_parallel_task = execute_parallel_task; surf_workstation_resource->extension_public->get_route = get_route; + surf_workstation_resource->extension_public->get_route_size = get_route_size; + surf_workstation_resource->extension_public->get_link_name = get_link_name; + surf_workstation_resource->extension_public->get_link_bandwidth = get_link_bandwidth; + surf_workstation_resource->extension_public->get_link_latency = get_link_latency; workstation_set = xbt_dict_new(); network_link_set = xbt_dict_new();