Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Reimplement function get_onelink_route.
[simgrid.git] / src / surf / surf_routing_floyd.c
index 28f4f6c..d262408 100644 (file)
@@ -32,31 +32,35 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network
 static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
 {
   xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
-  THROW_UNIMPLEMENTED;
-//  route_t route =   xbt_new0(s_route_t, 1);
-//  route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL);
-//
-//  xbt_dict_cursor_t c1 = NULL, c2 = NULL;
-//  char *k1, *d1, *k2, *d2;
-//  xbt_dict_foreach(asg->to_index, c1, k1, d1) {
-//    xbt_dict_foreach(asg->to_index, c2, k2, d2) {
-//      xbt_dynar_reset(route->link_list);
-//      floyd_get_route_and_latency(asg, k1, k2, route, NULL);
-//      if (xbt_dynar_length(route->link_list) == 1) {
-//        void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
-//        onelink_t onelink = xbt_new0(s_onelink_t, 1);
-//        onelink->link_ptr = link;
-//        if (asg->hierarchy == SURF_ROUTING_BASE) {
-//          onelink->src = xbt_strdup(k1);
-//          onelink->dst = xbt_strdup(k2);
-//        } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
-//          onelink->src = route->src_gateway;
-//          onelink->dst = route->dst_gateway;
-//        }
-//        xbt_dynar_push(ret, &onelink);
-//      }
-//    }
-//  }
+  route_t route =   xbt_new0(s_route_t, 1);
+  route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL);
+
+  int src,dst;
+  network_element_t src_elm, dst_elm;
+  int table_size = xbt_dynar_length(asg->index_network_elm);
+  for(src=0; src < table_size; src++) {
+    for(dst=0; dst< table_size; dst++) {
+      xbt_dynar_reset(route->link_list);
+      src_elm = xbt_dynar_get_as(asg->index_network_elm,src,network_element_t);
+      dst_elm = xbt_dynar_get_as(asg->index_network_elm,dst,network_element_t);
+      floyd_get_route_and_latency(asg, src_elm, dst_elm, route, NULL);
+
+      if (xbt_dynar_length(route->link_list) == 1) {
+        void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0);
+        onelink_t onelink = xbt_new0(s_onelink_t, 1);
+        onelink->link_ptr = link;
+        if (asg->hierarchy == SURF_ROUTING_BASE) {
+          onelink->src = src_elm;
+          onelink->dst = dst_elm;
+        } else if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
+          onelink->src = route->src_gateway;
+          onelink->dst = route->dst_gateway;
+        }
+        xbt_dynar_push(ret, &onelink);
+      }
+    }
+  }
+
   return ret;
 }
 
@@ -66,7 +70,7 @@ static void floyd_get_route_and_latency(AS_t asg, network_element_t src, network
 
   /* set utils vars */
   as_floyd_t as = (as_floyd_t)asg;
-  size_t table_size = asg->nb_index;
+  size_t table_size = xbt_dynar_length(asg->index_network_elm);
 
   generic_src_dst_check(asg, src, dst);
   int *src_id = &(src->id);
@@ -147,7 +151,7 @@ static void floyd_finalize(AS_t rc)
   int i, j;
   size_t table_size;
   if (as) {
-    table_size = as->generic_routing.nb_index;
+    table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
     /* Delete link_table */
     for (i = 0; i < table_size; i++)
       for (j = 0; j < table_size; j++)
@@ -184,7 +188,7 @@ void model_floyd_end(AS_t current_routing)
        unsigned int i, j, a, b, c;
 
        /* set the size of table routing */
-       size_t table_size = as->generic_routing.nb_index;
+       size_t table_size = xbt_dynar_length(as->generic_routing.index_network_elm);
 
        if(!as->link_table)
        {
@@ -249,7 +253,7 @@ void model_floyd_parse_route(AS_t rc, const char *src,
        as_floyd_t as = (as_floyd_t) rc;
 
        /* set the size of table routing */
-       size_t table_size = rc->nb_index;
+       size_t table_size = xbt_dynar_length(rc->index_network_elm);
     network_element_t src_net_elm, dst_net_elm;
 
     src_net_elm = (network_element_t)xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL);