X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/36360f35fad6a78d7bcd1100ff08098eb3f1a633..74214a6669ee21beba3e799a78b95f4e56c3b692:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 4dc768419d..a0b74ee2ae 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -92,7 +92,7 @@ static void generic_set_bypassroute(routing_component_t rc, const char* src, con /* ************************************************************************** */ /* *************** GENERIC BUSINESS METHODS (declarations) ****************** */ -static xbt_dict_t generic_get_onelink_routes (void); +static xbt_dynar_t generic_get_onelink_routes (routing_component_t rc); static int generic_is_router (const char *name); static route_extended_t generic_get_bypassroute(routing_component_t rc, const char* src, const char* dst); @@ -677,9 +677,38 @@ static void finalize(void) { xbt_free(global_routing); } -static xbt_dict_t get_onelink_routes(void) +static xbt_dynar_t recursive_get_onelink_routes (routing_component_t rc) { - xbt_die("global \"get_onelink_routes\" function not implemented yet"); + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + //adding my one link routes + unsigned int cpt; + void *link; + xbt_dynar_t onelink_mine = rc->get_onelink_routes (rc); + if (onelink_mine){ + xbt_dynar_foreach(onelink_mine, cpt, link) { + xbt_dynar_push(ret,&link); + } + } + + //recursing + char *key; + xbt_dict_cursor_t cursor=NULL; + routing_component_t rc_child; + xbt_dict_foreach(rc->routing_sons, cursor, key, rc_child) { + xbt_dynar_t onelink_child = recursive_get_onelink_routes (rc_child);//->get_onelink_routes (rc_child); + if (onelink_child){ + xbt_dynar_foreach(onelink_child, cpt, link) { + xbt_dynar_push(ret,&link); + } + } + } + return ret; +} + +static xbt_dynar_t get_onelink_routes(void) +{ + return recursive_get_onelink_routes (global_routing->root); } static int is_router(const char *name) @@ -746,9 +775,34 @@ typedef struct { } s_routing_component_full_t,*routing_component_full_t; /* Business methods */ -static xbt_dict_t full_get_onelink_routes(void) +static xbt_dynar_t full_get_onelink_routes(routing_component_t rc) { - xbt_die("\"full_get_onelink_routes\" function not implemented yet"); + xbt_dynar_t ret = xbt_dynar_new (sizeof(onelink_t), xbt_free); + + routing_component_full_t routing = (routing_component_full_t)rc; + int table_size = xbt_dict_length(routing->to_index); + xbt_dict_cursor_t c1 = NULL, c2 = NULL; + char *k1, *d1, *k2, *d2; + xbt_dict_foreach(routing->to_index, c1, k1, d1) { + xbt_dict_foreach (routing->to_index, c2, k2, d2) { + int *src_id = xbt_dict_get_or_null(routing->to_index, k1); + int *dst_id = xbt_dict_get_or_null(routing->to_index, k2); + xbt_assert2(src_id && dst_id, "Ask for route \"from\"(%s) or \"to\"(%s) no found in the local table",src,dst); + route_extended_t route = TO_ROUTE_FULL(*src_id,*dst_id); + 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->src = xbt_strdup (k1); + onelink->dst = xbt_strdup (k2); + onelink->link_ptr = link; + xbt_dynar_push (ret, &onelink); + } + } + } + } + return ret; } static int full_is_router(const char *name) @@ -916,7 +970,7 @@ typedef struct { } s_routing_component_floyd_t,*routing_component_floyd_t; /* Business methods */ -static xbt_dict_t floyd_get_onelink_routes(void) +static xbt_dynar_t floyd_get_onelink_routes(routing_component_t rc) { xbt_die("\"floyd_get_onelink_routes\" function not implemented yet"); } @@ -1275,7 +1329,7 @@ static void add_loopback_dijkstra(routing_component_dijkstra_t rc) { } /* Business methods */ -static xbt_dict_t dijkstra_get_onelink_routes(void) +static xbt_dynar_t dijkstra_get_onelink_routes(routing_component_t rc) { xbt_die("\"dijkstra_get_onelink_routes\" function not implemented yet"); } @@ -1734,7 +1788,7 @@ static char* remplace(char* value, const char** src_list, int src_size, const ch return xbt_strdup(result_result); } -static xbt_dict_t rulebased_get_onelink_routes(void) +static xbt_dynar_t rulebased_get_onelink_routes(routing_component_t rc) { xbt_die("\"rulebased_get_onelink_routes\" function not implemented yet"); } @@ -1879,7 +1933,7 @@ typedef struct { } s_routing_component_none_t,*routing_component_none_t; /* Business methods */ -static xbt_dict_t none_get_onelink_routes(void){ +static xbt_dynar_t none_get_onelink_routes(routing_component_t rc){ return NULL; } static int none_is_router(const char *name){ @@ -2107,7 +2161,7 @@ static void generic_set_bypassroute(routing_component_t rc, const char* src, con /* ************************************************************************** */ /* *********************** GENERIC BUSINESS METHODS ************************* */ -static xbt_dict_t generic_get_onelink_routes (void) +static xbt_dynar_t generic_get_onelink_routes (routing_component_t rc) { xbt_die("\"generic_get_onelink_routes\" not implemented yet"); }