X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5679feeea5b84a6058073ce48ddfbc5be9f23e54..ece2a48768fd651b376314538a44fe06da2abec0:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 61c0be47e4..a9630d2eb0 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -478,7 +478,7 @@ static void elements_father(const char *src, const char *dst, * * \param src the source host name * \param dst the destination host name - * \param *e_route the route where the links are stored + * \param *route the route where the links are stored. It is either NULL or a ready to use dynar * \param *latency the latency, if needed * * This function is called by "get_route" and "get_latency". It allows to walk @@ -502,21 +502,16 @@ static void _get_route_and_latency(const char *src, const char *dst, route_t e_route = xbt_new0(s_route_t, 1); e_route->link_list = xbt_dynar_new(global_routing->size_of_link, NULL); - if (route) { - common_father->get_route(common_father, src, dst, e_route); - xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); - *route = e_route->link_list; - } - if (latency) { - *latency = common_father->get_latency(common_father, src, dst, e_route); - xbt_assert(*latency >= 0.0, - "latency error on route between \"%s\" and \"%s\"", src, dst); - } - if (e_route) { - xbt_free(e_route->src_gateway); - xbt_free(e_route->dst_gateway); - xbt_free(e_route); - } + + common_father->get_route(common_father, src, dst, e_route); + *route = e_route->link_list; + + if (latency) + *latency += common_father->get_latency(common_father, src, dst, e_route); + + xbt_free(e_route->src_gateway); + xbt_free(e_route->dst_gateway); + xbt_free(e_route); return; } @@ -530,8 +525,6 @@ static void _get_route_and_latency(const char *src, const char *dst, if (latency) xbt_die("Bypass cannot work yet with get_latency"); // FIXME: that limitation seems supurious to me -- check with alvin - if (!route) - xbt_die("You're asking for route and latency but don't ask for any of them, you weirdo"); *route = xbt_dynar_new(global_routing->size_of_link, NULL); xbt_dynar_foreach(e_route_bypass->link_list, cpt, link) { @@ -556,71 +549,46 @@ static void _get_route_and_latency(const char *src, const char *dst, (e_route_cnt->dst_gateway == NULL), "bad gateway for route between \"%s\" and \"%s\"", src, dst); - if (route) { - *route = xbt_dynar_new(global_routing->size_of_link, NULL); - } + *route = xbt_dynar_new(global_routing->size_of_link, NULL); + if (latency) { - *latency = common_father->get_latency(common_father, + *latency += common_father->get_latency(common_father, src_father->name, dst_father->name, e_route_cnt); - xbt_assert(*latency >= 0.0, - "latency error on route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); } /* If source gateway is not our source, we have to recursively find our way up to this point */ if (strcmp(src, e_route_cnt->src_gateway)) { - double latency_src; xbt_dynar_t route_src; _get_route_and_latency(src, e_route_cnt->src_gateway, (route ? &route_src : NULL), - (latency ? &latency_src : NULL)); - if (route) { - xbt_assert(route_src, "no route between \"%s\" and \"%s\"", - src, e_route_cnt->src_gateway); - xbt_dynar_foreach(route_src, cpt, link) { - xbt_dynar_push(*route, &link); - } - xbt_dynar_free(&route_src); - } - if (latency) { - xbt_assert(latency_src >= 0.0, - "latency error on route between \"%s\" and \"%s\"", - src, e_route_cnt->src_gateway); - *latency += latency_src; - } - } + latency); - if (route) { - xbt_dynar_foreach(e_route_cnt->link_list, cpt, link) { + xbt_dynar_foreach(route_src, cpt, link) { xbt_dynar_push(*route, &link); } + xbt_dynar_free(&route_src); + } + + xbt_dynar_foreach(e_route_cnt->link_list, cpt, link) { + xbt_dynar_push(*route, &link); } /* If dest gateway is not our destination, we have to recursively find our way from this point */ if (strcmp(e_route_cnt->dst_gateway, dst)) { - double latency_dst; xbt_dynar_t route_dst; _get_route_and_latency(e_route_cnt->dst_gateway, dst, (route ? &route_dst : NULL), - (latency ? &latency_dst : NULL)); - if (route) { - xbt_assert(route_dst, "no route between \"%s\" and \"%s\"", - e_route_cnt->dst_gateway, dst); - xbt_dynar_foreach(route_dst, cpt, link) { - xbt_dynar_push(*route, &link); - } - xbt_dynar_free(&route_dst); - } - if (latency) { - xbt_assert(latency_dst >= 0.0, - "latency error on route between \"%s\" and \"%s\"", - e_route_cnt->dst_gateway, dst); - *latency += latency_dst; + latency); + + xbt_dynar_foreach(route_dst, cpt, link) { + xbt_dynar_push(*route, &link); } + xbt_dynar_free(&route_dst); + } generic_free_route(e_route_cnt); @@ -631,44 +599,31 @@ static void _get_route_and_latency(const char *src, const char *dst, * * \param src the source host name * \param dst the destination host name - * \param route where to store the list of links (or NULL if you are not interested in it) + * \param route where to store the list of links. + * If *route=NULL, create a short lived dynar. Else, fill the provided dynar * \param latency where to store the latency experienced on the path (or NULL if not interested) - * \param cleanup boolean whether the dynar should be automatically destroyed or not + * It is the caller responsability to initialize latency to 0 (we add to provided route) + * \pre route!=NULL * * walk through the routing components tree and find a route between hosts * by calling the differents "get_route" functions in each routing component. - * No need to free the returned dynar. It will be freed at the next call. */ void routing_get_route_and_latency(const char *src, const char *dst, - xbt_dynar_t * route, double *latency, int cleanup) + xbt_dynar_t * route, double *latency) { static xbt_dynar_t last_route = NULL; - _get_route_and_latency(src, dst, route, latency); - xbt_assert(!route || *route, "no route between \"%s\" and \"%s\"", src, dst); - xbt_assert(!latency || *latency >= 0.0, - "latency error on route between \"%s\" and \"%s\"", src, dst); - if (route) { + int need_cleanup = !(*route); + + if (need_cleanup) { xbt_dynar_free(&last_route); - last_route = cleanup ? *route : NULL; + last_route = *route = xbt_dynar_new(global_routing->size_of_link,NULL); } -} -/** - * \brief Generic method: find a route between hosts - * - * \param src the source host name - * \param dst the destination host name - * - * walk through the routing components tree and find a route between hosts - * by calling the differents "get_route" functions in each routing component. - * Leaves the caller the responsability to clean the returned dynar. - */ -static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) -{ - xbt_dynar_t route = NULL; - routing_get_route_and_latency(src, dst, &route, NULL, 0); - return route; + _get_route_and_latency(src, dst, route, latency); + + xbt_assert(!latency || *latency >= 0.0, + "negative latency on route between \"%s\" and \"%s\"", src, dst); } static xbt_dynar_t recursive_get_onelink_routes(AS_t rc) @@ -729,7 +684,6 @@ void routing_model_create(size_t size_of_links, void *loopback) /* config the uniq global routing */ global_routing = xbt_new0(s_routing_global_t, 1); global_routing->root = NULL; - global_routing->get_route_no_cleanup = get_route_no_cleanup; global_routing->get_onelink_routes = get_onelink_routes; global_routing->loopback = loopback; global_routing->size_of_link = size_of_links;