Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Get route in ptask_L07 only when needed.
[simgrid.git] / src / surf / workstation_ptask_L07.c
index 4ed016c..15f7371 100644 (file)
@@ -8,10 +8,12 @@
 #include "xbt/str.h"
 #include "xbt/dict.h"
 #include "surf_private.h"
+#include "surf/surf_resource.h"
+//#include "surf/surf_resource_lmm.h"
 
 typedef enum {
   SURF_WORKSTATION_RESOURCE_CPU,
-  SURF_WORKSTATION_RESOURCE_LINK,
+  SURF_WORKSTATION_RESOURCE_LINK
 } e_surf_workstation_model_type_t;
 
 /**************************************/
@@ -24,8 +26,8 @@ typedef struct cpu_L07 {
   double power_scale;
   double power_current;
   tmgr_trace_event_t power_event;
-  e_surf_resource_state_t state_current;
   tmgr_trace_event_t state_event;
+  e_surf_resource_state_t state_current;
   int id;                       /* cpu and network card are a single object... */
 } s_cpu_L07_t, *cpu_L07_t;
 
@@ -74,28 +76,20 @@ static void ptask_update_action_bound(surf_action_workstation_L07_t action)
   double lat_current = 0.0;
   double lat_bound = -1.0;
   int i, j;
-  unsigned int cpt;
-  link_L07_t link;
 
   for (i = 0; i < workstation_nb; i++) {
     for (j = 0; j < workstation_nb; j++) {
-      xbt_dynar_t route =
-          global_routing->get_route(surf_resource_name
-                                    (action->workstation_list[i]),
-                                    surf_resource_name(action->
-                                                       workstation_list
-                                                       [j]));
-
-      double lat = 0.0;
+      xbt_dynar_t route=NULL;
 
       if (action->communication_amount[i * workstation_nb + j] > 0) {
-        xbt_dynar_foreach(route, cpt, link) {
-          lat += link->lat_current;
-        }
+        double lat = 0.0;
+        routing_get_route_and_latency(surf_resource_name
+            (action->workstation_list[i]),
+            surf_resource_name(action->workstation_list[j]),
+            &route, &lat);
         lat_current =
             MAX(lat_current,
-                lat * action->communication_amount[i * workstation_nb +
-                                                   j]);
+                lat * action->communication_amount[i * workstation_nb + j]);
       }
     }
   }
@@ -193,8 +187,8 @@ static void ptask_action_set_priority(surf_action_t action,
 static double ptask_action_get_remains(surf_action_t action)
 {
   XBT_IN("(%p)", action);
-  return action->remains;
   XBT_OUT();
+  return action->remains;
 }
 
 /**************************************/
@@ -402,14 +396,12 @@ static void ptask_update_resource_state(void *id,
 
 static void ptask_finalize(void)
 {
-  if (ptask_parallel_task_link_set != NULL)
-    xbt_dict_free(&ptask_parallel_task_link_set);
+  xbt_dict_free(&ptask_parallel_task_link_set);
 
   surf_model_exit(surf_workstation_model);
   surf_workstation_model = NULL;
   surf_model_exit(surf_network_model);
   surf_network_model = NULL;
-  global_routing->finalize();
 
   ptask_host_count = 0;
 
@@ -454,28 +446,23 @@ static surf_action_t ptask_execute_parallel_task(int workstation_nb,
   double latency = 0.0;
 
   if (ptask_parallel_task_link_set == NULL)
-    ptask_parallel_task_link_set = xbt_dict_new();
+    ptask_parallel_task_link_set = xbt_dict_new_homogeneous(NULL);
 
   xbt_dict_reset(ptask_parallel_task_link_set);
 
   /* Compute the number of affected resources... */
   for (i = 0; i < workstation_nb; i++) {
     for (j = 0; j < workstation_nb; j++) {
-      link_L07_t link;
-      xbt_dynar_t route =
-          global_routing->get_route(surf_resource_name
-                                    (workstation_list[i]),
-                                    surf_resource_name(workstation_list
-                                                       [j]));
-      double lat = 0.0;
-
-      if (communication_amount[i * workstation_nb + j] > 0)
-        xbt_dynar_foreach(route, cpt, link) {
-        lat += link->lat_current;
-        xbt_dict_set(ptask_parallel_task_link_set,
-                     link->generic_resource.name, link, NULL);
-        }
-      latency = MAX(latency, lat);
+      xbt_dynar_t route=NULL;
+
+      if (communication_amount[i * workstation_nb + j] > 0) {
+        double lat=0.0;
+        routing_get_route_and_latency(
+            surf_resource_name(workstation_list[i]),
+            surf_resource_name(workstation_list[j]),
+            &route,&lat);
+        latency = MAX(latency, lat);
+      }
     }
   }
 
@@ -516,14 +503,15 @@ static surf_action_t ptask_execute_parallel_task(int workstation_nb,
   for (i = 0; i < workstation_nb; i++) {
     for (j = 0; j < workstation_nb; j++) {
       link_L07_t link;
-      xbt_dynar_t route =
-          global_routing->get_route(surf_resource_name
-                                    (workstation_list[i]),
-                                    surf_resource_name(workstation_list
-                                                       [j]));
-
+      xbt_dynar_t route=NULL;
       if (communication_amount[i * workstation_nb + j] == 0.0)
         continue;
+
+      routing_get_route_and_latency(
+          surf_resource_name(workstation_list[i]),
+          surf_resource_name(workstation_list[j]),
+          &route,NULL);
+
       xbt_dynar_foreach(route, cpt, link) {
         lmm_expand_add(ptask_maxmin_system, link->constraint,
                        action->variable,
@@ -589,10 +577,13 @@ static surf_action_t ptask_action_sleep(void *cpu, double duration)
   return (surf_action_t) action;
 }
 
-static xbt_dynar_t ptask_get_route(void *src, void *dst)
+static xbt_dynar_t ptask_get_route(void *src, void *dst) // FIXME: kill that callback kind?
 {
-  return global_routing->get_route(surf_resource_name(src),
-                                   surf_resource_name(dst));
+  xbt_dynar_t route=NULL;
+  routing_get_route_and_latency(
+      surf_resource_name(src), surf_resource_name(dst),
+      &route,NULL);
+  return route;
 }
 
 static double ptask_get_link_bandwidth(const void *link)
@@ -657,12 +648,12 @@ static void* ptask_cpu_create_resource(const char *name, double power_scale,
 static void ptask_parse_cpu_init(sg_platf_host_cbarg_t host)
 {
   ptask_cpu_create_resource(
-                 host->V_host_id,
-                 host->V_host_power_peak,
-                 host->V_host_power_scale,
-                 host->V_host_power_trace,
-                 host->V_host_state_initial,
-                 host->V_host_state_trace,
+                 host->id,
+                 host->power_peak,
+                 host->power_scale,
+                 host->power_trace,
+                 host->initial_state,
+                 host->state_trace,
                  host->properties);
 }
 
@@ -710,22 +701,44 @@ static void* ptask_link_create_resource(const char *name,
   return nw_link;
 }
 
-static void ptask_parse_link_init(void)
+static void ptask_parse_link_init(sg_platf_link_cbarg_t link)
 {
-  if(struct_lnk->V_policy_initial_link == SURF_LINK_FULLDUPLEX)
-  {
-         ptask_link_create_resource(bprintf("%s_UP",struct_lnk->V_link_id), struct_lnk->V_link_bandwidth, struct_lnk->V_link_bandwidth_file,
-                      struct_lnk->V_link_latency, struct_lnk->V_link_latency_file, struct_lnk->V_link_state, struct_lnk->V_link_state_file,
-                      struct_lnk->V_policy_initial_link, current_property_set);
-    ptask_link_create_resource(bprintf("%s_DOWN",struct_lnk->V_link_id), struct_lnk->V_link_bandwidth, struct_lnk->V_link_bandwidth_file,
-            struct_lnk->V_link_latency, struct_lnk->V_link_latency_file, struct_lnk->V_link_state, struct_lnk->V_link_state_file,
-                      struct_lnk->V_policy_initial_link, current_property_set);
-  }
-  else
-  {
-         ptask_link_create_resource(xbt_strdup(struct_lnk->V_link_id), struct_lnk->V_link_bandwidth, struct_lnk->V_link_bandwidth_file,
-               struct_lnk->V_link_latency, struct_lnk->V_link_latency_file, struct_lnk->V_link_state, struct_lnk->V_link_state_file,
-                      struct_lnk->V_policy_initial_link, current_property_set);
+  if (link->policy == SURF_LINK_FULLDUPLEX) {
+    char *link_id;
+    link_id = bprintf("%s_UP", link->id);
+    ptask_link_create_resource(link_id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               link->properties);
+    xbt_free(link_id);
+    link_id = bprintf("%s_DOWN", link->id);
+    ptask_link_create_resource(link_id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               NULL); /* FIXME: We need to deep copy the
+                                       * properties or we won't be able to free
+                                       * it */
+    xbt_free(link_id);
+  } else {
+    ptask_link_create_resource(link->id,
+                               link->bandwidth,
+                               link->bandwidth_trace,
+                               link->latency,
+                               link->latency_trace,
+                               link->state,
+                               link->state_trace,
+                               link->policy,
+                               link->properties);
   }
 
   current_property_set = NULL;
@@ -800,9 +813,8 @@ static void ptask_add_traces(void)
 
 static void ptask_define_callbacks()
 {
-  /* Adding callback functions */
   sg_platf_host_add_cb(ptask_parse_cpu_init);
-  surfxml_add_callback(ETag_surfxml_link_cb_list, &ptask_parse_link_init);
+  sg_platf_link_add_cb(ptask_parse_link_init);
   sg_platf_postparse_add_cb(ptask_add_traces);
 }
 
@@ -866,14 +878,14 @@ static void ptask_model_init_internal(void)
       ptask_add_traces;
 
   if (!ptask_maxmin_system)
-    ptask_maxmin_system = lmm_system_new();
+    ptask_maxmin_system = lmm_system_new(1);
 
   routing_model_create(sizeof(link_L07_t),
-      ptask_link_create_resource(xbt_strdup("__loopback__"),
-                                      498000000, NULL, 0.000015, NULL,
-                                      SURF_RESOURCE_ON, NULL,
-                                      SURF_LINK_FATPIPE, NULL),
-                       ptask_get_link_latency);
+                       ptask_link_create_resource("__loopback__",
+                                                  498000000, NULL,
+                                                  0.000015, NULL,
+                                                  SURF_RESOURCE_ON, NULL,
+                                                  SURF_LINK_FATPIPE, NULL));
 
 }
 
@@ -888,8 +900,5 @@ void surf_workstation_model_init_ptask_L07(void)
   surf_network_model = surf_model_init();
   ptask_define_callbacks();
   ptask_model_init_internal();
-
-  update_model_description(surf_workstation_model_description,
-                           "ptask_L07", surf_workstation_model);
   xbt_dynar_push(model_list, &surf_workstation_model);
 }