Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
AS->get_route is no longer in charge of creating the route it fills
[simgrid.git] / src / surf / surf_routing_vivaldi.c
index 014c412..22b9616 100644 (file)
@@ -8,27 +8,24 @@
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_vivaldi, surf, "Routing part of surf");
 
 /* Business methods */
-static route_t vivaldi_get_route(AS_t rc, const char *src, const char *dst)
+static void vivaldi_get_route(AS_t rc, const char *src, const char *dst,
+    route_t route)
 {
          xbt_assert(rc && src
                      && dst,
                      "Invalid params for \"get_route\" function at AS \"%s\"",
                      rc->name);
 
-         route_t new_e_route = xbt_new0(s_route_t, 1);
-         new_e_route->src_gateway = ROUTER_PEER(src);
-         new_e_route->dst_gateway = ROUTER_PEER(dst);
-         new_e_route->link_list =  xbt_dynar_new(0, NULL);
-         return new_e_route;
+         route->src_gateway = ROUTER_PEER(src);
+         route->dst_gateway = ROUTER_PEER(dst);
 }
 
-static double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst)
+static XBT_INLINE double euclidean_dist_comp(int index, xbt_dynar_t src, xbt_dynar_t dst)
 {
        double src_coord, dst_coord;
 
-       // FIXME converting from string to float each time we need a coordinate is ... suboptimal
-       src_coord = atof(xbt_dynar_get_as(src, index, char *));
-       dst_coord = atof(xbt_dynar_get_as(dst, index, char *));
+  src_coord = xbt_dynar_get_as(src, index, double);
+  dst_coord = xbt_dynar_get_as(dst, index, double);
 
        return (src_coord-dst_coord)*(src_coord-dst_coord);
 
@@ -47,9 +44,7 @@ static double base_vivaldi_get_latency (const char *src, const char *dst)
   xbt_die("Coord src '%s' :%p   dst '%s' :%p",src,src_ctn,dst,dst_ctn);
 
   euclidean_dist = sqrt (euclidean_dist_comp(0,src_ctn,dst_ctn)+euclidean_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 *)));
-
-  xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist);
+                                + fabs(xbt_dynar_get_as(src_ctn, 2, double))+fabs(xbt_dynar_get_as(dst_ctn, 2, double));
 
   //From .ms to .s
   return euclidean_dist / 1000;
@@ -58,12 +53,9 @@ static double base_vivaldi_get_latency (const char *src, const char *dst)
 static double vivaldi_get_latency (AS_t rc,const char *src, const char *dst, route_t e_route)
 {
   if(routing_get_network_element_type(src) == SURF_NETWORK_ELEMENT_AS) {
-         int need_to_clean = e_route?0:1;
-         double latency;
-         e_route = e_route ? e_route : rc->get_route(rc, src, dst);
-         latency = base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway);
-         if(need_to_clean) generic_free_route(e_route);
-         return latency;
+    if (e_route)
+      return base_vivaldi_get_latency(e_route->src_gateway,e_route->dst_gateway);
+    return base_vivaldi_get_latency(ROUTER_PEER(src),ROUTER_PEER(dst));
   } else {
          return base_vivaldi_get_latency(src,dst);
   }