Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
revert [a30523e] (remove supernovae) because I need some timings on G5K, and fix...
[simgrid.git] / src / surf / surf_routing_floyd.c
index cd869e9..e094d6c 100644 (file)
@@ -25,7 +25,8 @@ typedef struct {
   route_t *link_table;
 } s_as_floyd_t, *as_floyd_t;
 
-static void floyd_get_route(AS_t asg, const char *src, const char *dst, route_t res);
+static void floyd_get_route_and_latency(AS_t asg, const char *src, const char *dst,
+    route_t res, double *lat);
 
 /* Business methods */
 static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
@@ -40,7 +41,7 @@ static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
   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(asg, k1, k2, route);
+      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);
@@ -59,12 +60,9 @@ static xbt_dynar_t floyd_get_onelink_routes(AS_t asg)
   return ret;
 }
 
-static void floyd_get_route(AS_t asg, const char *src, const char *dst, route_t res)
+static void floyd_get_route_and_latency(AS_t asg, const char *src, const char *dst,
+    route_t res, double *lat)
 {
-  xbt_assert(asg && src
-              && dst,
-              "Invalid params for \"get_route\" function at AS \"%s\"",
-              asg->name);
 
   /* set utils vars */
   as_floyd_t as = (as_floyd_t)asg;
@@ -73,10 +71,8 @@ static void floyd_get_route(AS_t asg, const char *src, const char *dst, route_t
   generic_src_dst_check(asg, src, dst);
   int *src_id = xbt_dict_get_or_null(asg->to_index, src);
   int *dst_id = xbt_dict_get_or_null(asg->to_index, dst);
-  xbt_assert(src_id
-              && dst_id,
-              "Ask for route \"from\"(%s)  or \"to\"(%s) no found in the local table",
-              src, dst);
+  if (src_id == NULL || dst_id == NULL)
+    THROWF(arg_error,0,"No route from '%s' to '%s'",src,dst);
 
   /* create a result route */
 
@@ -108,14 +104,14 @@ static void floyd_get_route(AS_t asg, const char *src, const char *dst, route_t
 
     if (asg->hierarchy == SURF_ROUTING_RECURSIVE && !first
         && strcmp(gw_dst, prev_gw_src)) {
-      xbt_dynar_t e_route_as_to_as;
-      routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL,1);
-      xbt_assert(e_route_as_to_as, "no route between \"%s\" and \"%s\"",
-                  gw_dst, prev_gw_src);
+      xbt_dynar_t e_route_as_to_as=NULL;
+      routing_get_route_and_latency(gw_dst, prev_gw_src,&e_route_as_to_as,NULL);
       links = e_route_as_to_as;
       int pos = 0;
       xbt_dynar_foreach(links, cpt, link) {
         xbt_dynar_insert_at(res->link_list, pos, &link);
+        if (lat)
+          *lat += surf_network_model->extension.network.get_link_latency(link);
         pos++;
       }
     }
@@ -123,18 +119,19 @@ static void floyd_get_route(AS_t asg, const char *src, const char *dst, route_t
     links = e_route->link_list;
     xbt_dynar_foreach(links, cpt, link) {
       xbt_dynar_unshift(res->link_list, &link);
+      if (lat)
+        *lat += surf_network_model->extension.network.get_link_latency(link);
     }
     first = 0;
 
   } while (pred != *src_id);
-  xbt_assert(pred != -1, "no route from host %d to %d (\"%s\" to \"%s\")",
-              *src_id, *dst_id, src, dst);
+  if (pred == -1)
+    THROWF(arg_error,0,"No route from '%s' to '%s'",src,dst);
 
   if (asg->hierarchy == SURF_ROUTING_RECURSIVE) {
     res->src_gateway = xbt_strdup(gw_src);
     res->dst_gateway = xbt_strdup(first_gw);
   }
-
 }
 
 static void floyd_finalize(AS_t rc)
@@ -155,8 +152,8 @@ static void floyd_finalize(AS_t rc)
     xbt_dict_free(&(as->generic_routing.to_index));
     /* Delete dictionary index dict, predecessor and links table */
     xbt_free(as->predecessor_table);
-    /* Delete structure */
-    xbt_free(rc);
+
+    model_generic_finalize(rc);
   }
 }
 
@@ -165,7 +162,7 @@ AS_t model_floyd_create(void)
   as_floyd_t new_component = (as_floyd_t)model_generic_create_sized(sizeof(s_as_floyd_t));
   new_component->generic_routing.parse_route = model_floyd_parse_route;
   new_component->generic_routing.parse_ASroute = model_floyd_parse_route;
-  new_component->generic_routing.get_route = floyd_get_route;
+  new_component->generic_routing.get_route_and_latency = floyd_get_route_and_latency;
   new_component->generic_routing.get_onelink_routes =
       floyd_get_onelink_routes;
   new_component->generic_routing.finalize = floyd_finalize;
@@ -234,7 +231,7 @@ void model_floyd_end(AS_t current_routing)
        }
 }
 
-static int surf_pointer_resource_cmp(const void *a, const void *b) {
+static int floyd_pointer_resource_cmp(const void *a, const void *b) {
   return a != b;
 }
 
@@ -291,7 +288,7 @@ void model_floyd_parse_route(AS_t rc, const char *src,
                xbt_assert(!xbt_dynar_compare(
                          (void*)TO_FLOYD_LINK(*src_id, *dst_id)->link_list,
                          (void*)link_route_to_test,
-                         (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+                         (int_f_cpvoid_cpvoid_t) floyd_pointer_resource_cmp),
                          "The route between \"%s\" and \"%s\" already exists", src,dst);
        }
        else
@@ -336,7 +333,7 @@ void model_floyd_parse_route(AS_t rc, const char *src,
                        xbt_assert(!xbt_dynar_compare(
                                  (void*)TO_FLOYD_LINK(*dst_id, *src_id)->link_list,
                              (void*)link_route_to_test,
-                                 (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+                                 (int_f_cpvoid_cpvoid_t) floyd_pointer_resource_cmp),
                                  "The route between \"%s\" and \"%s\" already exists", src,dst);
                }
                else