+ if(TO_FLOYD_LINK(*src_id, *dst_id))
+ {
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("See Route from \"%s\" to \"%s\"", src, dst);
+ else
+ DEBUG4("See ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
+ route->src_gateway, dst, route->dst_gateway);
+ char * link_name;
+ unsigned int cpt;
+ xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
+ xbt_dynar_foreach(route->generic_route.link_list,cpt,link_name)
+ {
+ void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+ xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
+ xbt_dynar_push(link_route_to_test,&link);
+ }
+ xbt_assert2(!xbt_dynar_compare(
+ (void*)TO_FLOYD_LINK(*src_id, *dst_id)->generic_route.link_list,
+ (void*)link_route_to_test,
+ (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+ "The route between \"%s\" and \"%s\" already exists", src,dst);
+ xbt_free(link_route_to_test);
+ }
+ else
+ {
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("Load Route from \"%s\" to \"%s\"", src, dst);
+ else
+ DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src,
+ route->src_gateway, dst, route->dst_gateway);
+
+ TO_FLOYD_LINK(*src_id, *dst_id) =
+ generic_new_extended_route(rc->hierarchy, route, 1);
+ TO_FLOYD_PRED(*src_id, *dst_id) = *src_id;
+ TO_FLOYD_COST(*src_id, *dst_id) =
+ ((TO_FLOYD_LINK(*src_id, *dst_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */
+ }
+
+ if( A_surfxml_route_symmetrical == A_surfxml_route_symmetrical_YES
+ || A_surfxml_ASroute_symmetrical == A_surfxml_ASroute_symmetrical_YES )
+ {
+ if(TO_FLOYD_LINK(*dst_id, *src_id))
+ {
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("See Route from \"%s\" to \"%s\"", dst, src);
+ else
+ DEBUG4("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
+ route->src_gateway, src, route->dst_gateway);
+ char * link_name;
+ unsigned int i;
+ xbt_dynar_t link_route_to_test = xbt_dynar_new(global_routing->size_of_link, NULL);
+ for(i=xbt_dynar_length(route->generic_route.link_list) ;i>0 ;i--)
+ {
+ link_name = xbt_dynar_get_as(route->generic_route.link_list,i-1,void *);
+ void *link = xbt_dict_get_or_null(surf_network_model->resource_set, link_name);
+ xbt_assert1(link,"Link : '%s' doesn't exists.",link_name);
+ xbt_dynar_push(link_route_to_test,&link);
+ }
+ xbt_assert2(!xbt_dynar_compare(
+ (void*)TO_FLOYD_LINK(*dst_id, *src_id)->generic_route.link_list,
+ (void*)link_route_to_test,
+ (int_f_cpvoid_cpvoid_t) surf_pointer_resource_cmp),
+ "The route between \"%s\" and \"%s\" already exists", src,dst);
+ xbt_free(link_route_to_test);
+ }
+ else
+ {
+ if(route->dst_gateway && route->src_gateway)
+ {
+ char *gw_src = xbt_strdup(route->src_gateway);
+ char *gw_dst = xbt_strdup(route->dst_gateway);
+ route->src_gateway = gw_dst;
+ route->dst_gateway = gw_src;
+ }
+
+ if(!route->dst_gateway && !route->src_gateway)
+ DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src);
+ else
+ DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst,
+ route->src_gateway, src, route->dst_gateway);
+
+ TO_FLOYD_LINK(*dst_id, *src_id) =
+ generic_new_extended_route(rc->hierarchy, route, 0);
+ TO_FLOYD_PRED(*dst_id, *src_id) = *dst_id;
+ TO_FLOYD_COST(*dst_id, *src_id) =
+ ((TO_FLOYD_LINK(*dst_id, *src_id))->generic_route.link_list)->used; /* count of links, old model assume 1 */
+ }
+ }
+}
+
+/* ************************************************************************** */
+/* ********** Dijkstra & Dijkstra Cached ROUTING **************************** */
+
+typedef struct {
+ s_routing_component_t generic_routing;
+ xbt_graph_t route_graph; /* xbt_graph */
+ xbt_dict_t graph_node_map; /* map */
+ xbt_dict_t route_cache; /* use in cache mode */
+ int cached;
+} s_routing_component_dijkstra_t, *routing_component_dijkstra_t;
+
+
+typedef struct graph_node_data {
+ int id;
+ int graph_id; /* used for caching internal graph id's */
+} s_graph_node_data_t, *graph_node_data_t;
+
+typedef struct graph_node_map_element {
+ xbt_node_t node;
+} s_graph_node_map_element_t, *graph_node_map_element_t;
+
+typedef struct route_cache_element {
+ int *pred_arr;