Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change interface for elements_father, and avoid to allocate a dynar.
[simgrid.git] / src / surf / surf_routing.c
index 2e0a499..5f67fdf 100644 (file)
@@ -8,7 +8,7 @@
 #include <pcre.h>               /* regular expression library */
 #endif
 #include "surf_routing_private.h"
-#include "surf_routing.h"
+#include "surf/surf_routing.h"
 
 xbt_lib_t host_lib;
 int ROUTING_HOST_LEVEL; //Routing level
@@ -576,13 +576,13 @@ static char* elements_As_name(const char *name)
  * Get the common father of the to processing units, and the first different 
  * father in the chain
  */
-static xbt_dynar_t elements_father(const char *src, const char *dst)
+static void elements_father(const char *src, const char *dst,
+                            routing_component_t *res_father,
+                            routing_component_t *res_src,
+                            routing_component_t *res_dst)
 {
-
   xbt_assert(src && dst, "bad parameters for \"elements_father\" method");
 
-  xbt_dynar_t result = xbt_dynar_new(sizeof(char *), NULL);
-
   routing_component_t src_as, dst_as;
   int index_src, index_dst, index_father_src, index_father_dst;
   xbt_dynar_t path_src = NULL;
@@ -645,14 +645,12 @@ static xbt_dynar_t elements_father(const char *src, const char *dst)
     father = xbt_dynar_get_ptr(path_src, index_father_src);
 
   /* (5) result generation */
-  xbt_dynar_push(result, father);       /* first same the father of src and dst */
-  xbt_dynar_push(result, current_src);  /* second the first different father of src */
-  xbt_dynar_push(result, current_dst);  /* three  the first different father of dst */
+  *res_father = *father;        /* first same the father of src and dst */
+  *res_src = *current_src;      /* second the first different father of src */
+  *res_dst = *current_dst;      /* three  the first different father of dst */
 
   xbt_dynar_free(&path_src);
   xbt_dynar_free(&path_dst);
-
-  return result;
 }
 
 /* Global Business methods */
@@ -662,54 +660,44 @@ static xbt_dynar_t elements_father(const char *src, const char *dst)
  *
  * \param src the source host name 
  * \param dst the destination host name
+ * \param *e_route the route where the links are stored
  * 
  * This function is called by "get_route". It allows to walk recursively
  * through the routing components tree.
  */
-static route_extended_t _get_route(const char *src, const char *dst)
+static void _get_route(const char *src, const char *dst,route_extended_t *e_route)
 {
-
-  void *link;
-  unsigned int cpt = 0;
-
   XBT_DEBUG("Solve route  \"%s\" to \"%s\"", src, dst);
-
   xbt_assert(src && dst, "bad parameters for \"_get_route\" method");
 
-  route_extended_t e_route, e_route_cnt, e_route_src = NULL, e_route_dst =
-      NULL;
-
-  xbt_dynar_t elem_father_list = elements_father(src, dst);
-
-  routing_component_t common_father =
-      xbt_dynar_get_as(elem_father_list, 0, routing_component_t);
-  routing_component_t src_father =
-      xbt_dynar_get_as(elem_father_list, 1, routing_component_t);
-  routing_component_t dst_father =
-      xbt_dynar_get_as(elem_father_list, 2, routing_component_t);
-
-  e_route = xbt_new0(s_route_extended_t, 1);
-  e_route->src_gateway = NULL;
-  e_route->dst_gateway = NULL;
-  e_route->generic_route.link_list =
-      xbt_dynar_new(global_routing->size_of_link, NULL);
+  routing_component_t common_father;
+  routing_component_t src_father;
+  routing_component_t dst_father;
+  elements_father(src, dst, &common_father, &src_father, &dst_father);
 
   if (src_father == dst_father) {       /* SURF_ROUTING_BASE */
 
-       e_route_cnt =
+       (*e_route) =
          (*(common_father->get_route)) (common_father, src, dst);
-       xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", src,
+       xbt_assert((*e_route), "no route between \"%s\" and \"%s\"", src,
                          dst);
-         // FIXME (optim): faire une copie et pas une série de push
-       xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) {
-       xbt_dynar_push(e_route->generic_route.link_list, &link);
-       }
-       generic_free_extended_route(e_route_cnt);
 
   } else {                      /* SURF_ROUTING_RECURSIVE */
 
+       void *link;
+       unsigned int cpt = 0;
+
+       route_extended_t e_route_cnt = NULL;
+       route_extended_t e_route_src = NULL;
+       route_extended_t e_route_dst = NULL;
     route_extended_t e_route_bypass = NULL;
 
+    (*e_route) = xbt_new0(s_route_extended_t, 1);
+    (*e_route)->src_gateway = NULL;
+    (*e_route)->dst_gateway = NULL;
+    (*e_route)->generic_route.link_list =
+        xbt_dynar_new(global_routing->size_of_link, NULL);
+
     if (common_father->get_bypass_route)
       e_route_bypass =
           (*(common_father->get_bypass_route)) (common_father, src, dst);
@@ -730,38 +718,34 @@ static route_extended_t _get_route(const char *src, const char *dst)
                 dst);
 
     if (strcmp(src, e_route_cnt->src_gateway)) {
-      e_route_src = _get_route(src, e_route_cnt->src_gateway);
+      _get_route(src, e_route_cnt->src_gateway, &e_route_src);
       xbt_assert(e_route_src, "no route between \"%s\" and \"%s\"", src,
                   e_route_cnt->src_gateway);
       xbt_dynar_foreach(e_route_src->generic_route.link_list, cpt, link) {
-        xbt_dynar_push(e_route->generic_route.link_list, &link);
+        xbt_dynar_push((*e_route)->generic_route.link_list, &link);
       }
     }
 
     xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) {
-      xbt_dynar_push(e_route->generic_route.link_list, &link);
+      xbt_dynar_push((*e_route)->generic_route.link_list, &link);
     }
 
     if (strcmp(e_route_cnt->dst_gateway, dst)) {
-      e_route_dst = _get_route(e_route_cnt->dst_gateway, dst);
+      _get_route(e_route_cnt->dst_gateway, dst, &e_route_dst);
       xbt_assert(e_route_dst, "no route between \"%s\" and \"%s\"",
                   e_route_cnt->dst_gateway, dst);
       xbt_dynar_foreach(e_route_dst->generic_route.link_list, cpt, link) {
-        xbt_dynar_push(e_route->generic_route.link_list, &link);
+        xbt_dynar_push((*e_route)->generic_route.link_list, &link);
       }
     }
 
-    e_route->src_gateway = xbt_strdup(e_route_cnt->src_gateway);
-    e_route->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway);
+    (*e_route)->src_gateway = xbt_strdup(e_route_cnt->src_gateway);
+    (*e_route)->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway);
 
     generic_free_extended_route(e_route_src);
     generic_free_extended_route(e_route_cnt);
     generic_free_extended_route(e_route_dst);
   }
-
-  xbt_dynar_free(&elem_father_list);
-
-  return e_route;
 }
 
 static double _get_latency(const char *src, const char *dst)
@@ -773,14 +757,10 @@ static double _get_latency(const char *src, const char *dst)
 
   route_extended_t e_route_cnt;
 
-  xbt_dynar_t elem_father_list = elements_father(src, dst);
-
-  routing_component_t common_father =
-      xbt_dynar_get_as(elem_father_list, 0, routing_component_t);
-  routing_component_t src_father =
-      xbt_dynar_get_as(elem_father_list, 1, routing_component_t);
-  routing_component_t dst_father =
-      xbt_dynar_get_as(elem_father_list, 2, routing_component_t);
+  routing_component_t common_father;
+  routing_component_t src_father;
+  routing_component_t dst_father;
+  elements_father(src, dst, &common_father, &src_father, &dst_father);
 
   if (src_father == dst_father) {       /* SURF_ROUTING_BASE */
 
@@ -832,8 +812,6 @@ static double _get_latency(const char *src, const char *dst)
        
   }
 
-  xbt_dynar_free(&elem_father_list);
-
   return latency;
 }
 
@@ -850,9 +828,9 @@ static double _get_latency(const char *src, const char *dst)
 static xbt_dynar_t get_route(const char *src, const char *dst)
 {
 
-  route_extended_t e_route;
+  route_extended_t e_route = NULL;
 
-  e_route = _get_route(src, dst);
+  _get_route(src, dst, &e_route);
   xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst);
 
   if (global_routing->last_route)