Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Do routing parse before tracing parse
[simgrid.git] / src / surf / surf_routing.c
index b2e27e8..c2dbd83 100644 (file)
@@ -112,7 +112,7 @@ static void parse_S_host(sg_platf_host_cbarg_t host)
   info->rc_component = current_routing;
   info->rc_type = SURF_NETWORK_ELEMENT_HOST;
   info->name = xbt_strdup(host->id);
-  info->id = current_routing->parse_PU(current_routing, host->id);
+  info->id = current_routing->parse_PU(current_routing, (void *) info);
   xbt_lib_set(host_lib, host->id, ROUTING_HOST_LEVEL, (void *) info);
   XBT_DEBUG("Having set name '%s' id '%d'",host->id,info->id);
 
@@ -157,7 +157,7 @@ static void parse_S_router(sg_platf_router_cbarg_t router)
   info->rc_component = current_routing;
   info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
   info->name = xbt_strdup(router->id);
-  info->id = current_routing->parse_PU(current_routing, router->id);
+  info->id = current_routing->parse_PU(current_routing, (void *) info);
   xbt_lib_set(as_router_lib, router->id, ROUTING_ASR_LEVEL, (void *) info);
   XBT_DEBUG("Having set name '%s' id '%d'",router->id,info->id);
 
@@ -398,7 +398,7 @@ void routing_AS_begin(const char *AS_id, const char *wanted_routing_type)
     xbt_dict_set(current_routing->routing_sons, AS_id,
                  (void *) new_as, NULL);
     /* add to the father element list */
-    info->id = current_routing->parse_AS(current_routing, AS_id);
+    info->id = current_routing->parse_AS(current_routing, (void *) info);
   } else {
     THROWF(arg_error, 0, "All defined components must be belong to a AS");
   }
@@ -597,8 +597,8 @@ static void _get_route_and_latency(network_element_t src, network_element_t dst,
 /**
  * \brief Find a route between hosts
  *
- * \param src the source host name
- * \param dst the destination host name
+ * \param src the network_element_t for src host
+ * \param dst the network_element_t for dst host
  * \param route where to store the list of links.
  *              If *route=NULL, create a short lived dynar. Else, fill the provided dynar
  * \param latency where to store the latency experienced on the path (or NULL if not interested)
@@ -832,10 +832,12 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
     xbt_dict_set(patterns, "suffix", xbt_strdup(cluster->suffix), NULL);
   }
 
-
   XBT_DEBUG("<AS id=\"%s\"\trouting=\"Cluster\">", cluster->id);
   sg_platf_new_AS_begin(cluster->id, "Cluster");
 
+  current_routing->link_up_down_list
+            = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+
   //Make all hosts
   radical_elements = xbt_str_split(cluster->radical, ",");
   xbt_dynar_foreach(radical_elements, iter, groups) {
@@ -901,23 +903,22 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster)
       link.policy = cluster->sharing_policy;
       sg_platf_new_link(&link);
 
-      surf_parsing_link_up_down_t info =
-          xbt_new0(s_surf_parsing_link_up_down_t, 1);
+      s_surf_parsing_link_up_down_t info;
+
       if (link.policy == SURF_LINK_FULLDUPLEX) {
         char *tmp_link = bprintf("%s_UP", link_id);
-        info->link_up =
+        info.link_up =
             xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
         free(tmp_link);
         tmp_link = bprintf("%s_DOWN", link_id);
-        info->link_down =
+        info.link_down =
             xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
         free(tmp_link);
       } else {
-        info->link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
-        info->link_down = info->link_up;
+        info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+        info.link_down = info.link_up;
       }
-      surf_routing_cluster_add_link(host_id, info);
-
+      xbt_dynar_push(current_routing->link_up_down_list,&info);
       xbt_free(link_id);
       xbt_free(host_id);
     }
@@ -1235,6 +1236,10 @@ void routing_register_callbacks()
   sg_platf_storage_type_add_cb(routing_parse_storage_type);
   sg_platf_mount_add_cb(routing_parse_mount);
 
+  /* we care about the ASes while parsing the platf. Incredible, isnt it? */
+  sg_platf_AS_end_add_cb(routing_AS_end);
+  sg_platf_AS_begin_add_cb(routing_AS_begin);
+
 #ifdef HAVE_TRACING
   instr_routing_define_callbacks();
 #endif