X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/92a73f2197461e843f3a9f94d2b6305e8ab4e550..7e5ab0d2140f17598ab7f8ca86c2c38022bd954b:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 644ef18f96..15cf032c06 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -576,83 +576,68 @@ 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); - +#define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */ routing_component_t src_as, dst_as; - int index_src, index_dst, index_father_src, index_father_dst; - xbt_dynar_t path_src = NULL; - xbt_dynar_t path_dst = NULL; - routing_component_t current = NULL; - routing_component_t *current_src = NULL; - routing_component_t *current_dst = NULL; - routing_component_t *father = NULL; + routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH]; + routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH]; + int index_src = 0; + int index_dst = 0; + routing_component_t current; + routing_component_t current_src; + routing_component_t current_dst; + routing_component_t father; /* (1) find the as where the src and dst are located */ - void * src_data = xbt_lib_get_or_null(host_lib,src, ROUTING_HOST_LEVEL); - void * dst_data = xbt_lib_get_or_null(host_lib,dst, ROUTING_HOST_LEVEL); - if(!src_data) src_data = xbt_lib_get_or_null(as_router_lib,src, ROUTING_ASR_LEVEL); - if(!dst_data) dst_data = xbt_lib_get_or_null(as_router_lib,dst, ROUTING_ASR_LEVEL); - src_as = ((network_element_info_t)src_data)->rc_component; - dst_as = ((network_element_info_t)dst_data)->rc_component; - - xbt_assert(src_as - && dst_as, - "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, - dst); + network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src, + ROUTING_HOST_LEVEL); + network_element_info_t dst_data = xbt_lib_get_or_null(host_lib, dst, + ROUTING_HOST_LEVEL); + if (!src_data) + src_data = xbt_lib_get_or_null(as_router_lib, src, ROUTING_ASR_LEVEL); + if (!dst_data) + dst_data = xbt_lib_get_or_null(as_router_lib, dst, ROUTING_ASR_LEVEL); + src_as = src_data->rc_component; + dst_as = dst_data->rc_component; + + xbt_assert(src_as && dst_as, + "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, dst); /* (2) find the path to the root routing component */ - path_src = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = src_as; - while (current != NULL) { - xbt_dynar_push(path_src, ¤t); - current = current->routing_father; + for (current = src_as ; current != NULL ; current = current->routing_father) { + path_src[index_src++] = current; + xbt_assert(index_src <= ELEMENTS_FATHER_MAXDEPTH, + "ELEMENTS_FATHER_MAXDEPTH should be increased for path_src"); } - path_dst = xbt_dynar_new(sizeof(routing_component_t), NULL); - current = dst_as; - while (current != NULL) { - xbt_dynar_push(path_dst, ¤t); - current = current->routing_father; + for (current = dst_as ; current != NULL ; current = current->routing_father) { + path_dst[index_dst++] = current; + xbt_assert(index_dst <= ELEMENTS_FATHER_MAXDEPTH, + "ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst"); } /* (3) find the common father */ - index_src = path_src->used - 1; - index_dst = path_dst->used - 1; - current_src = xbt_dynar_get_ptr(path_src, index_src); - current_dst = xbt_dynar_get_ptr(path_dst, index_dst); - while (index_src >= 0 && index_dst >= 0 && *current_src == *current_dst) { - current_src = xbt_dynar_get_ptr(path_src, index_src); - current_dst = xbt_dynar_get_ptr(path_dst, index_dst); - index_src--; - index_dst--; - } - index_src++; - index_dst++; - current_src = xbt_dynar_get_ptr(path_src, index_src); - current_dst = xbt_dynar_get_ptr(path_dst, index_dst); + do { + current_src = path_src[--index_src]; + current_dst = path_dst[--index_dst]; + } while (index_src > 0 && index_dst > 0 && current_src == current_dst); /* (4) they are not in the same routing component, make the path */ - index_father_src = index_src + 1; - index_father_dst = index_dst + 1; - - if (*current_src == *current_dst) + if (current_src == current_dst) father = current_src; else - father = xbt_dynar_get_ptr(path_src, index_father_src); + father = path_src[index_src + 1]; /* (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 the common 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; +#undef ELEMENTS_FATHER_MAXDEPTH } /* Global Business methods */ @@ -672,14 +657,10 @@ static void _get_route(const char *src, const char *dst,route_extended_t *e_rout XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); - 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 */ @@ -752,8 +733,6 @@ static void _get_route(const char *src, const char *dst,route_extended_t *e_rout generic_free_extended_route(e_route_cnt); generic_free_extended_route(e_route_dst); } - - xbt_dynar_free(&elem_father_list); } static double _get_latency(const char *src, const char *dst) @@ -765,14 +744,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 */ @@ -824,8 +799,6 @@ static double _get_latency(const char *src, const char *dst) } - xbt_dynar_free(&elem_father_list); - return latency; }