X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9e8d76f5eb3db584150db55fc3929623188b6b08..15bed974d6d64a1925f914dedcc9b5cbe0e78fec:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index f18024e93f..5f67fdf37e 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -576,13 +576,13 @@ static char* elements_As_name(const char *name) * Get the common father of the to processing units, and the first different * father in the chain */ -static xbt_dynar_t elements_father(const char *src, const char *dst) +static void elements_father(const char *src, const char *dst, + routing_component_t *res_father, + routing_component_t *res_src, + routing_component_t *res_dst) { - xbt_assert(src && dst, "bad parameters for \"elements_father\" method"); - xbt_dynar_t result = xbt_dynar_new(sizeof(char *), NULL); - routing_component_t src_as, dst_as; int index_src, index_dst, index_father_src, index_father_dst; xbt_dynar_t path_src = NULL; @@ -645,14 +645,12 @@ static xbt_dynar_t elements_father(const char *src, const char *dst) father = xbt_dynar_get_ptr(path_src, index_father_src); /* (5) result generation */ - xbt_dynar_push(result, father); /* first same the father of src and dst */ - xbt_dynar_push(result, current_src); /* second the first different father of src */ - xbt_dynar_push(result, current_dst); /* three the first different father of dst */ + *res_father = *father; /* first same the father of src and dst */ + *res_src = *current_src; /* second the first different father of src */ + *res_dst = *current_dst; /* three the first different father of dst */ xbt_dynar_free(&path_src); xbt_dynar_free(&path_dst); - - return result; } /* Global Business methods */ @@ -662,54 +660,44 @@ static xbt_dynar_t 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 * * This function is called by "get_route". It allows to walk recursively * through the routing components tree. */ -static route_extended_t _get_route(const char *src, const char *dst) +static void _get_route(const char *src, const char *dst,route_extended_t *e_route) { - - void *link; - unsigned int cpt = 0; - XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); - xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); - route_extended_t e_route, e_route_cnt, e_route_src = NULL, e_route_dst = - NULL; - - xbt_dynar_t elem_father_list = elements_father(src, dst); - - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); - - e_route = xbt_new0(s_route_extended_t, 1); - e_route->src_gateway = NULL; - e_route->dst_gateway = NULL; - e_route->generic_route.link_list = - xbt_dynar_new(global_routing->size_of_link, NULL); + routing_component_t common_father; + routing_component_t src_father; + routing_component_t dst_father; + elements_father(src, dst, &common_father, &src_father, &dst_father); if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - e_route_cnt = + (*e_route) = (*(common_father->get_route)) (common_father, src, dst); - xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", src, + xbt_assert((*e_route), "no route between \"%s\" and \"%s\"", src, dst); - // FIXME (optim): faire une copie et pas une série de push - xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); - } - generic_free_extended_route(e_route_cnt); } else { /* SURF_ROUTING_RECURSIVE */ + void *link; + unsigned int cpt = 0; + + route_extended_t e_route_cnt = NULL; + route_extended_t e_route_src = NULL; + route_extended_t e_route_dst = NULL; route_extended_t e_route_bypass = NULL; + (*e_route) = xbt_new0(s_route_extended_t, 1); + (*e_route)->src_gateway = NULL; + (*e_route)->dst_gateway = NULL; + (*e_route)->generic_route.link_list = + xbt_dynar_new(global_routing->size_of_link, NULL); + if (common_father->get_bypass_route) e_route_bypass = (*(common_father->get_bypass_route)) (common_father, src, dst); @@ -730,38 +718,34 @@ static route_extended_t _get_route(const char *src, const char *dst) dst); if (strcmp(src, e_route_cnt->src_gateway)) { - e_route_src = _get_route(src, e_route_cnt->src_gateway); + _get_route(src, e_route_cnt->src_gateway, &e_route_src); xbt_assert(e_route_src, "no route between \"%s\" and \"%s\"", src, e_route_cnt->src_gateway); xbt_dynar_foreach(e_route_src->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } } xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } if (strcmp(e_route_cnt->dst_gateway, dst)) { - e_route_dst = _get_route(e_route_cnt->dst_gateway, dst); + _get_route(e_route_cnt->dst_gateway, dst, &e_route_dst); xbt_assert(e_route_dst, "no route between \"%s\" and \"%s\"", e_route_cnt->dst_gateway, dst); xbt_dynar_foreach(e_route_dst->generic_route.link_list, cpt, link) { - xbt_dynar_push(e_route->generic_route.link_list, &link); + xbt_dynar_push((*e_route)->generic_route.link_list, &link); } } - e_route->src_gateway = xbt_strdup(e_route_cnt->src_gateway); - e_route->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); + (*e_route)->src_gateway = xbt_strdup(e_route_cnt->src_gateway); + (*e_route)->dst_gateway = xbt_strdup(e_route_cnt->dst_gateway); generic_free_extended_route(e_route_src); generic_free_extended_route(e_route_cnt); generic_free_extended_route(e_route_dst); } - - xbt_dynar_free(&elem_father_list); - - return e_route; } static double _get_latency(const char *src, const char *dst) @@ -773,14 +757,10 @@ static double _get_latency(const char *src, const char *dst) route_extended_t e_route_cnt; - xbt_dynar_t elem_father_list = elements_father(src, dst); - - routing_component_t common_father = - xbt_dynar_get_as(elem_father_list, 0, routing_component_t); - routing_component_t src_father = - xbt_dynar_get_as(elem_father_list, 1, routing_component_t); - routing_component_t dst_father = - xbt_dynar_get_as(elem_father_list, 2, routing_component_t); + routing_component_t common_father; + routing_component_t src_father; + routing_component_t dst_father; + elements_father(src, dst, &common_father, &src_father, &dst_father); if (src_father == dst_father) { /* SURF_ROUTING_BASE */ @@ -832,8 +812,6 @@ static double _get_latency(const char *src, const char *dst) } - xbt_dynar_free(&elem_father_list); - return latency; } @@ -850,9 +828,9 @@ static double _get_latency(const char *src, const char *dst) static xbt_dynar_t get_route(const char *src, const char *dst) { - route_extended_t e_route; + route_extended_t e_route = NULL; - e_route = _get_route(src, dst); + _get_route(src, dst, &e_route); xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); if (global_routing->last_route)