Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Rewrite remplace in surf_routing_rulebase and avoid calls to strlen..
[simgrid.git] / src / surf / surf_routing.c
index 5f67fdf..15cf032 100644 (file)
@@ -582,75 +582,62 @@ static void elements_father(const char *src, const char *dst,
                             routing_component_t *res_dst)
 {
   xbt_assert(src && dst, "bad parameters for \"elements_father\" method");
-
+#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */
   routing_component_t src_as, dst_as;
-  int index_src, index_dst, index_father_src, index_father_dst;
-  xbt_dynar_t path_src = NULL;
-  xbt_dynar_t path_dst = NULL;
-  routing_component_t current = NULL;
-  routing_component_t *current_src = NULL;
-  routing_component_t *current_dst = NULL;
-  routing_component_t *father = NULL;
+  routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH];
+  routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH];
+  int index_src = 0;
+  int index_dst = 0;
+  routing_component_t current;
+  routing_component_t current_src;
+  routing_component_t current_dst;
+  routing_component_t father;
 
   /* (1) find the as where the src and dst are located */
-  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);
-  src_as = ((network_element_info_t)src_data)->rc_component;
-  dst_as = ((network_element_info_t)dst_data)->rc_component;
-
-  xbt_assert(src_as
-              && dst_as,
-              "Ask for route \"from\"(%s) or \"to\"(%s) no found", src,
-              dst);
+  network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src,
+                                                        ROUTING_HOST_LEVEL);
+  network_element_info_t 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);
+  src_as = src_data->rc_component;
+  dst_as = dst_data->rc_component;
+
+  xbt_assert(src_as && dst_as,
+             "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, dst);
 
   /* (2) find the path to the root routing component */
-  path_src = xbt_dynar_new(sizeof(routing_component_t), NULL);
-  current = src_as;
-  while (current != NULL) {
-    xbt_dynar_push(path_src, &current);
-    current = current->routing_father;
+  for (current = src_as ; current != NULL ; current = current->routing_father) {
+    path_src[index_src++] = current;
+    xbt_assert(index_src <= ELEMENTS_FATHER_MAXDEPTH,
+               "ELEMENTS_FATHER_MAXDEPTH should be increased for path_src");
   }
-  path_dst = xbt_dynar_new(sizeof(routing_component_t), NULL);
-  current = dst_as;
-  while (current != NULL) {
-    xbt_dynar_push(path_dst, &current);
-    current = current->routing_father;
+  for (current = dst_as ; current != NULL ; current = current->routing_father) {
+    path_dst[index_dst++] = current;
+    xbt_assert(index_dst <= ELEMENTS_FATHER_MAXDEPTH,
+               "ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst");
   }
 
   /* (3) find the common father */
-  index_src = path_src->used - 1;
-  index_dst = path_dst->used - 1;
-  current_src = xbt_dynar_get_ptr(path_src, index_src);
-  current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
-  while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) {
-    current_src = xbt_dynar_get_ptr(path_src, index_src);
-    current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
-    index_src--;
-    index_dst--;
-  }
-  index_src++;
-  index_dst++;
-  current_src = xbt_dynar_get_ptr(path_src, index_src);
-  current_dst = xbt_dynar_get_ptr(path_dst, index_dst);
+  do {
+    current_src = path_src[--index_src];
+    current_dst = path_dst[--index_dst];
+  } while (index_src > 0 && index_dst > 0 && current_src == current_dst);
 
   /* (4) they are not in the same routing component, make the path */
-  index_father_src = index_src + 1;
-  index_father_dst = index_dst + 1;
-
-  if (*current_src == *current_dst)
+  if (current_src == current_dst)
     father = current_src;
   else
-    father = xbt_dynar_get_ptr(path_src, index_father_src);
+    father = path_src[index_src + 1];
 
   /* (5) result generation */
-  *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 */
+  *res_father = father;         /* first the common 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);
+#undef ELEMENTS_FATHER_MAXDEPTH
 }
 
 /* Global Business methods */