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;*/
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;
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;
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);*/
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);
}
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;
}
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.
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.
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.
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)
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();
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)
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();
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)
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!");
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 **/
/**************************************/
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();