Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add a constructor to the generic parsing logic, and use it to factorize code
[simgrid.git] / src / surf / surf_routing_dijkstra.c
index ab9e58f..9e58253 100644 (file)
@@ -11,7 +11,7 @@ extern routing_global_t global_routing;
 extern routing_component_t current_routing;
 extern model_type_t current_routing_model;
 
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic");
 
 typedef struct {
   s_routing_component_t generic_routing;
@@ -50,9 +50,7 @@ static void route_cache_elem_free(void *e)
 static void graph_node_map_elem_free(void *e)
 {
   graph_node_map_element_t elm = (graph_node_map_element_t) e;
-  if (elm) {
-    xbt_free(elm);
-  }
+  xbt_free(elm);
 }
 
 static void graph_edge_data_free(void *e)
@@ -60,10 +58,8 @@ static void graph_edge_data_free(void *e)
   route_extended_t e_route = (route_extended_t) e;
   if (e_route) {
     xbt_dynar_free(&(e_route->generic_route.link_list));
-    if (e_route->src_gateway)
-      xbt_free(e_route->src_gateway);
-    if (e_route->dst_gateway)
-      xbt_free(e_route->dst_gateway);
+    xbt_free(e_route->src_gateway);
+    xbt_free(e_route->dst_gateway);
     xbt_free(e_route);
   }
 }
@@ -180,10 +176,43 @@ static void add_loopback_dijkstra(routing_component_dijkstra_t rc)
   }
 }
 
-/* Business methods */
+static route_extended_t dijkstra_get_route(routing_component_t rc,
+        const char *src,
+        const char *dst);
+
 static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc)
 {
-  xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet");
+ // xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet");
+         xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free);
+
+         routing_component_dijkstra_t routing = (routing_component_dijkstra_t) rc;
+         //size_t table_size = xbt_dict_length(routing->generic_routing.to_index);
+         xbt_dict_cursor_t c1 = NULL, c2 = NULL;
+         char *k1, *d1, *k2, *d2;
+         xbt_dict_foreach(routing->generic_routing.to_index, c1, k1, d1) {
+           xbt_dict_foreach(routing->generic_routing.to_index, c2, k2, d2) {
+             route_extended_t route = dijkstra_get_route(rc, k1, k2);
+             if (route) {
+               if (xbt_dynar_length(route->generic_route.link_list) == 1) {
+                 void *link =
+                     *(void **) xbt_dynar_get_ptr(route->generic_route.link_list,
+                                                  0);
+                 onelink_t onelink = xbt_new0(s_onelink_t, 1);
+                 onelink->link_ptr = link;
+                 if (routing->generic_routing.hierarchy == SURF_ROUTING_BASE) {
+                   onelink->src = xbt_strdup(k1);
+                   onelink->dst = xbt_strdup(k2);
+                 } else if (routing->generic_routing.hierarchy ==
+                            SURF_ROUTING_RECURSIVE) {
+                   onelink->src = xbt_strdup(route->src_gateway);
+                   onelink->dst = xbt_strdup(route->dst_gateway);
+                 }
+                 xbt_dynar_push(ret, &onelink);
+               }
+             }
+           }
+         }
+         return ret;
 }
 
 static route_extended_t dijkstra_get_route(routing_component_t rc,
@@ -330,8 +359,7 @@ static route_extended_t dijkstra_get_route(routing_component_t rc,
   }
 
   /* compose route path with links */
-  char *gw_src = NULL, *gw_dst =
-      NULL, *prev_gw_src, *prev_gw_dst, *first_gw = NULL;
+  char *gw_src = NULL, *gw_dst = NULL, *prev_gw_src, *first_gw = NULL;
 
   for (v = dst_node_id; v != src_node_id; v = pred_arr[v]) {
     xbt_node_t node_pred_v =
@@ -344,7 +372,6 @@ static route_extended_t dijkstra_get_route(routing_component_t rc,
                 *dst_id);
 
     prev_gw_src = gw_src;
-    prev_gw_dst = gw_dst;
 
     e_route = (route_extended_t) xbt_graph_edge_get_data(edge);
     gw_src = e_route->src_gateway;
@@ -416,51 +443,32 @@ static void dijkstra_finalize(routing_component_t rc)
 
 /* Creation routing model functions */
 
-void *model_dijkstra_both_create(int cached)
+routing_component_t model_dijkstra_both_create(int cached)
 {
-  routing_component_dijkstra_t new_component =
-      xbt_new0(s_routing_component_dijkstra_t, 1);
-  new_component->generic_routing.set_processing_unit =
-      generic_set_processing_unit;
-  new_component->generic_routing.set_autonomous_system =
-      generic_set_autonomous_system;
+  routing_component_dijkstra_t new_component = (routing_component_dijkstra_t)
+      routmod_generic_create(sizeof(s_routing_component_dijkstra_t));
+
   new_component->generic_routing.set_route = model_dijkstra_both_set_route;
   new_component->generic_routing.set_ASroute = model_dijkstra_both_set_route;
-  new_component->generic_routing.set_bypassroute = generic_set_bypassroute;
   new_component->generic_routing.get_route = dijkstra_get_route;
-  new_component->generic_routing.get_latency = generic_get_link_latency;
   new_component->generic_routing.get_onelink_routes =
       dijkstra_get_onelink_routes;
-  new_component->generic_routing.get_bypass_route =
-      generic_get_bypassroute;
   new_component->generic_routing.finalize = dijkstra_finalize;
   new_component->cached = cached;
-  new_component->generic_routing.to_index = xbt_dict_new();
-  new_component->generic_routing.bypassRoutes = xbt_dict_new();
-  new_component->generic_routing.get_network_element_type = get_network_element_type;
-  return new_component;
+
+  return (routing_component_t)new_component;
 }
 
-void *model_dijkstra_create(void)
+routing_component_t model_dijkstra_create(void)
 {
   return model_dijkstra_both_create(0);
 }
 
-void *model_dijkstracache_create(void)
+routing_component_t model_dijkstracache_create(void)
 {
   return model_dijkstra_both_create(1);
 }
 
-void model_dijkstra_both_load(void)
-{
-  /* use "surfxml_add_callback" to add a parse function call */
-}
-
-void model_dijkstra_both_unload(void)
-{
-  /* use "surfxml_del_callback" to remove a parse function call */
-}
-
 void model_dijkstra_both_end(void)
 {
   routing_component_dijkstra_t routing =
@@ -500,6 +508,9 @@ void model_dijkstra_both_set_route (routing_component_t rc, const char *src,
        src_id = xbt_dict_get_or_null(rc->to_index, src);
        dst_id = xbt_dict_get_or_null(rc->to_index, dst);
 
+       xbt_assert(src_id, "Network elements %s not found", src);
+       xbt_assert(dst_id, "Network elements %s not found", dst);
+
     /* Create the topology graph */
        if(!routing->route_graph)
        routing->route_graph = xbt_graph_new_graph(1, NULL);