Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Implement functions SD_workstation_route_get_list, SD_workstation_route_get_size...
authorthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Jun 2006 09:55:46 +0000 (09:55 +0000)
committerthiery <thiery@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 20 Jun 2006 09:55:46 +0000 (09:55 +0000)
to access those information.

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2406 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/simdag/datatypes.h
src/include/surf/surf.h
src/simdag/sd_global.c
src/simdag/sd_link.c
src/simdag/sd_workstation.c
src/surf/network.c
src/surf/network_dassf.c
src/surf/workstation.c
src/surf/workstation_KCCFLN05.c

index 78b64b6..f7d3299 100644 (file)
@@ -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;*/
index 893a87e..3887011 100644 (file)
@@ -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;
 
index bf190c0..52c35d5 100644 (file)
@@ -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;
 }
index dc3076e..89eed10 100644 (file)
@@ -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.
index 5c25338..ed3b9fb 100644 (file)
@@ -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.
index 99b301f..5fa3695 100644 (file)
@@ -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();
index 1a4651f..771898e 100644 (file)
@@ -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();
index f559003..5d6120c 100644 (file)
@@ -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!");
index c91ad04..d3d78ce 100644 (file)
@@ -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();