Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
src and dst can be in host_lib or as_router_lib.
[simgrid.git] / src / surf / surf_routing.c
index 2ac012e..2bc91e5 100644 (file)
@@ -170,8 +170,6 @@ static char *gw_src = NULL;     /* temporary store the gateway source name of a
 static char *gw_dst = NULL;     /* temporary store the gateway destination name of a route */
 static xbt_dynar_t link_list = NULL;    /* temporary store of current list link of a route */
 
-static xbt_dict_t coordinates = NULL;
-
 
 static double eculidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst)
 {
@@ -188,8 +186,13 @@ static double vivaldi_get_link_latency (routing_component_t rc,const char *src,
 {
   double euclidean_dist;
   xbt_dynar_t src_ctn, dst_ctn;
-  src_ctn = xbt_dict_get(coordinates, src);
-  dst_ctn = xbt_dict_get(coordinates, dst);
+  src_ctn = xbt_lib_get_or_null(host_lib, src, COORD_HOST_LEVEL);
+  if(!src_ctn) src_ctn = xbt_lib_get_or_null(as_router_lib, src, COORD_ASR_LEVEL);
+  dst_ctn = xbt_lib_get_or_null(host_lib, dst, COORD_HOST_LEVEL);
+  if(!dst_ctn) dst_ctn = xbt_lib_get_or_null(as_router_lib, dst, COORD_ASR_LEVEL);
+
+  if(dst_ctn == NULL || src_ctn == NULL)
+  xbt_die("Coord src '%s' :%p   dst '%s' :%p",src,src_ctn,dst,dst_ctn);
 
   euclidean_dist = sqrt (eculidean_dist_comp(0,src_ctn,dst_ctn)+eculidean_dist_comp(1,src_ctn,dst_ctn))
                                                                +fabs(atof(xbt_dynar_get_as(src_ctn, 2, char *)))+fabs(atof(xbt_dynar_get_as(dst_ctn, 2, char *)));
@@ -207,7 +210,7 @@ static double vivaldi_get_link_latency (routing_component_t rc,const char *src,
          if (strcmp(coord,"")) {
        xbt_dynar_t ctn = xbt_str_split_str(coord, " ");
        xbt_dynar_shrink(ctn,0);
-       xbt_dict_set (coordinates,host_id,ctn,NULL);
+       xbt_lib_set(host_lib, host_id, COORD_HOST_LEVEL, ctn);
   }
        */
 }
@@ -232,9 +235,10 @@ static void parse_S_host(const char *host_id, const char* coord)
   info->rc_type = SURF_NETWORK_ELEMENT_HOST;
   xbt_lib_set(host_lib,host_id,ROUTING_HOST_LEVEL,(void *) info);
   if (strcmp(coord,"")) {
+       if(!COORD_HOST_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'");
     xbt_dynar_t ctn = xbt_str_split_str(coord, " ");
     xbt_dynar_shrink(ctn, 0);
-    xbt_dict_set(coordinates, host_id, ctn, xbt_dynar_free_voidp);
+    xbt_lib_set(host_lib,host_id,COORD_HOST_LEVEL,(void *) ctn);
   }
 }
 
@@ -293,9 +297,10 @@ static void parse_S_router(const char *router_id)
 
   xbt_lib_set(as_router_lib,router_id,ROUTING_ASR_LEVEL,(void *) info);
   if (strcmp(A_surfxml_router_coordinates,"")) {
-         xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " ");
-         xbt_dynar_shrink(ctn, 0);
-         xbt_lib_set(as_router_lib,router_id,COORD_ASR_LEVEL,(void *) ctn);
+       if(!COORD_ASR_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'");
+    xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " ");
+    xbt_dynar_shrink(ctn, 0);
+    xbt_lib_set(as_router_lib,router_id,COORD_ASR_LEVEL,(void *) ctn);
   }
 }
 
@@ -561,10 +566,11 @@ static void parse_S_AS_XML(void)
   parse_S_AS(A_surfxml_AS_id, A_surfxml_AS_routing);
 
   if (strcmp(A_surfxml_AS_coordinates,"")) {
+       if(!COORD_ASR_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'");
     XBT_DEBUG("%s coordinates : %s", A_surfxml_AS_id, A_surfxml_AS_coordinates);
     xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_AS_coordinates, " ");
     xbt_dynar_shrink(ctn, 0);
-    xbt_dict_set(coordinates, A_surfxml_AS_id, ctn, xbt_dynar_free_voidp);
+    xbt_lib_set(as_router_lib,A_surfxml_AS_id,COORD_ASR_LEVEL,(void *) ctn);
   }
 }
 
@@ -1037,7 +1043,6 @@ static void finalize(void)
 {
   /* delete recursibly all the tree */
   _finalize(global_routing->root);
-  xbt_dict_free(&(coordinates));
   /* delete last_route */
   xbt_dynar_free(&(global_routing->last_route));
   /* delete global routing structure */
@@ -1114,8 +1119,6 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_
   /* no current routing at moment */
   current_routing = NULL;
 
-  coordinates = xbt_dict_new();
-
   /* parse generic elements */
   surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML);
   surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML);
@@ -1379,7 +1382,7 @@ static void model_full_set_route(routing_component_t rc, const char *src,
                xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
                xbt_dynar_foreach(route->generic_route.link_list,i,link_name)
                {
-                       void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+                       void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
                        xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
                        xbt_dynar_push(link_route_to_test,&link);
                }
@@ -1423,7 +1426,7 @@ static void model_full_set_route(routing_component_t rc, const char *src,
                        for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--)
                        {
                                link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *);
-                               void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+                               void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
                                xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
                                xbt_dynar_push(link_route_to_test,&link);
                        }
@@ -1751,7 +1754,7 @@ static void model_floyd_set_route(routing_component_t rc, const char *src,
                xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
                xbt_dynar_foreach(route->generic_route.link_list,cpt,link_name)
                {
-                       void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+                       void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
                        xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
                        xbt_dynar_push(link_route_to_test,&link);
                }
@@ -1796,7 +1799,7 @@ static void model_floyd_set_route(routing_component_t rc, const char *src,
                        for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--)
                        {
                                link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *);
-                               void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+                               void *link = xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
                                xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
                                xbt_dynar_push(link_route_to_test,&link);
                        }
@@ -2665,8 +2668,7 @@ static route_extended_t rulebased_get_route(routing_component_t rc,
           char *new_link_name =
               remplace(link_name, list_src, rc_src, list_dst, rc_dst);
           void *link =
-              xbt_dict_get_or_null(surf_network_model->resource_set,
-                                   new_link_name);
+                         xbt_lib_get_or_null(link_lib, new_link_name, SURF_LINK_LEVEL);
           if (link)
             xbt_dynar_push(links_list, &link);
           else
@@ -2990,14 +2992,17 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc,
   routing_component_t *current_dst = NULL;
 
   /* (1) find the as where the src and dst are located */
-  src_as = ((network_element_info_t)
-            xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL))->rc_component;
-  dst_as = ((network_element_info_t)
-            xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL))->rc_component;
-  xbt_assert2(src_as
-              && dst_as,
-              "Ask for route \"from\"(%s) or \"to\"(%s) no found", src,
-              dst);
+  void * src_data = xbt_lib_get_or_null(host_lib,src, ROUTING_HOST_LEVEL);
+  void * dst_data = xbt_lib_get_or_null(host_lib,dst, ROUTING_HOST_LEVEL);
+  if(!src_data) src_data = xbt_lib_get_or_null(as_router_lib,src, ROUTING_ASR_LEVEL);
+  if(!dst_data) dst_data = xbt_lib_get_or_null(as_router_lib,dst, ROUTING_ASR_LEVEL);
+
+  if(src_data == NULL || dst_data == NULL)
+         xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"",
+                    src, dst, rc->name);
+
+  src_as = ((network_element_info_t)src_data)->rc_component;
+  dst_as = ((network_element_info_t)dst_data)->rc_component;
 
   /* (2) find the path to the root routing component */
   path_src = xbt_dynar_new(sizeof(routing_component_t), NULL);
@@ -3135,7 +3140,7 @@ generic_new_route(e_surf_routing_hierarchy_t hierarchy,
   xbt_dynar_foreach(links, cpt, link_name) {
 
     void *link =
-        xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+               xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
     if (link) {
       if (order)
         xbt_dynar_push(links_id, &link);
@@ -3191,7 +3196,7 @@ generic_new_extended_route(e_surf_routing_hierarchy_t hierarchy,
   xbt_dynar_foreach(links, cpt, link_name) {
 
     void *link =
-        xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+               xbt_lib_get_or_null(link_lib, link_name, SURF_LINK_LEVEL);
     if (link) {
       if (order)
         xbt_dynar_push(links_id, &link);
@@ -3384,9 +3389,11 @@ static void routing_parse_Scluster(void)
   SURFXML_BUFFER_SET(AS_id, cluster_id);
 #ifdef HAVE_PCRE_LIB
   SURFXML_BUFFER_SET(AS_routing, "RuleBased");
+  SURFXML_BUFFER_SET(AS_coordinates, "");
   XBT_DEBUG("<AS id=\"%s\"\trouting=\"RuleBased\">", cluster_id);
 #else
   SURFXML_BUFFER_SET(AS_routing, "Full");
+  SURFXML_BUFFER_SET(AS_coordinates, "");
   XBT_DEBUG("<AS id=\"%s\"\trouting=\"Full\">", cluster_id);
 #endif
   SURFXML_START_TAG(AS);
@@ -3534,6 +3541,7 @@ static void routing_parse_Scluster(void)
 
   XBT_DEBUG("<router id=\"%s\"/>", router_id);
   SURFXML_BUFFER_SET(router_id, router_id);
+  SURFXML_BUFFER_SET(router_coordinates, "");
   SURFXML_START_TAG(router);
   SURFXML_END_TAG(router);