X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7e5ab0d2140f17598ab7f8ca86c2c38022bd954b..931b9d83f93b5e8da69fd0d2cab84402d9ecb317:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 15cf032c06..375a7c2a82 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -4,9 +4,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#ifdef HAVE_PCRE_LIB #include /* regular expression library */ -#endif #include "surf_routing_private.h" #include "surf/surf_routing.h" @@ -65,9 +63,7 @@ typedef enum { SURF_MODEL_DIJKSTRA, SURF_MODEL_DIJKSTRACACHE, SURF_MODEL_NONE, -#ifdef HAVE_PCRE_LIB SURF_MODEL_RULEBASED -#endif } e_routing_types; struct s_model_type routing_models[] = { {"Full", @@ -90,12 +86,10 @@ struct s_model_type routing_models[] = { {"Full", model_dijkstra_both_unload, model_dijkstra_both_end}, {"none", "No routing (usable with Constant network only)", model_none_create, model_none_load, model_none_unload, model_none_end}, -#ifdef HAVE_PCRE_LIB {"RuleBased", "Rule-Based routing data (...)", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end}, {"Vivaldi", "Vivaldi routing", model_rulebased_create, model_rulebased_load, model_rulebased_unload, model_rulebased_end}, -#endif {NULL, NULL, NULL, NULL, NULL, NULL} }; @@ -127,7 +121,8 @@ static double base_vivaldi_get_latency (const char *src, const char *dst) xbt_assert(euclidean_dist>=0, "Euclidean Dist is less than 0\"%s\" and \"%.2f\"", src, euclidean_dist); - return euclidean_dist; + //From .ms to .s + return euclidean_dist / 1000; } static double vivaldi_get_link_latency (routing_component_t rc,const char *src, const char *dst, route_extended_t e_route) @@ -610,14 +605,14 @@ static void elements_father(const char *src, const char *dst, /* (2) find the path to the root routing component */ for (current = src_as ; current != NULL ; current = current->routing_father) { + if (index_src >= ELEMENTS_FATHER_MAXDEPTH) + xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_src"); path_src[index_src++] = current; - xbt_assert(index_src <= ELEMENTS_FATHER_MAXDEPTH, - "ELEMENTS_FATHER_MAXDEPTH should be increased for path_src"); } for (current = dst_as ; current != NULL ; current = current->routing_father) { + if (index_dst >= ELEMENTS_FATHER_MAXDEPTH) + xbt_die("ELEMENTS_FATHER_MAXDEPTH should be increased for path_dst"); 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 */ @@ -643,163 +638,152 @@ static void elements_father(const char *src, const char *dst, /* Global Business methods */ /** - * \brief Recursive function for get_route + * \brief Recursive function for get_route_latency * * \param src the source host name * \param dst the destination host name * \param *e_route the route where the links are stored + * \param *latency the latency, if needed * - * This function is called by "get_route". It allows to walk recursively - * through the routing components tree. + * This function is called by "get_route" and "get_latency". It allows to walk + * recursively through the routing components tree. */ -static void _get_route(const char *src, const char *dst,route_extended_t *e_route) +static void _get_route_latency(const char *src, const char *dst, + xbt_dynar_t *route, double *latency) { - XBT_DEBUG("Solve route \"%s\" to \"%s\"", src, dst); - xbt_assert(src && dst, "bad parameters for \"_get_route\" method"); + XBT_DEBUG("Solve route/latency \"%s\" to \"%s\"", src, dst); + xbt_assert(src && dst, "bad parameters for \"_get_route_latency\" method"); 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 */ + if (src_father == dst_father) { /* SURF_ROUTING_BASE */ - (*e_route) = - (*(common_father->get_route)) (common_father, src, dst); - xbt_assert((*e_route), "no route between \"%s\" and \"%s\"", src, - dst); + route_extended_t e_route = NULL; + if (route) { + e_route = common_father->get_route(common_father, src, dst); + xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); + *route = e_route->generic_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); + } } 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); + e_route_bypass = common_father->get_bypass_route(common_father, src, dst); - if (e_route_bypass) - e_route_cnt = e_route_bypass; - else - e_route_cnt = - (*(common_father->get_route)) (common_father, src_father->name, - dst_father->name); + xbt_assert(!latency || !e_route_bypass, + "Bypass cannot work yet with get_latency"); + + route_extended_t e_route_cnt = e_route_bypass + ? e_route_bypass + : common_father->get_route(common_father, + src_father->name, dst_father->name); xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); + src_father->name, dst_father->name); xbt_assert((e_route_cnt->src_gateway == NULL) == - (e_route_cnt->dst_gateway == NULL), - "bad gateway for route between \"%s\" and \"%s\"", src, - 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); + } + if (latency) { + *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); + } + + void *link; + unsigned int cpt; if (strcmp(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); + double latency_src; + xbt_dynar_t route_src; + + _get_route_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; } } - xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { - xbt_dynar_push((*e_route)->generic_route.link_list, &link); + if (route) { + xbt_dynar_foreach(e_route_cnt->generic_route.link_list, cpt, link) { + xbt_dynar_push(*route, &link); + } } if (strcmp(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); + double latency_dst; + xbt_dynar_t route_dst; + + _get_route_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; } } - (*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); } } -static double _get_latency(const char *src, const char *dst) +/** + * \brief Generic function for get_route, get_route_no_cleanup, and get_latency + */ +static void get_route_latency(const char *src, const char *dst, + xbt_dynar_t *route, double *latency, int cleanup) { - double latency, latency_src, latency_dst = 0.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_cnt; - - 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 */ - - latency = - (*(common_father->get_latency)) (common_father, src, dst, NULL); - xbt_assert(latency>=0, "no route between \"%s\" and \"%s\"", src, - dst); - - } else { /* SURF_ROUTING_RECURSIVE */ - route_extended_t e_route_bypass = NULL; - if (common_father->get_bypass_route) - e_route_bypass = - (*(common_father->get_bypass_route)) (common_father, src, dst); - - xbt_assert(!e_route_bypass,"Bypass cannot work yet with get_latency"); - - e_route_cnt = - (*(common_father->get_route)) (common_father, src_father->name, - dst_father->name); - - xbt_assert(e_route_cnt, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); - - xbt_assert((e_route_cnt->src_gateway == NULL) == - (e_route_cnt->dst_gateway == NULL), - "bad gateway for route between \"%s\" and \"%s\"", src, - dst); - - latency = (*(common_father->get_latency)) (common_father, src_father->name, dst_father->name, e_route_cnt); - - xbt_assert(latency>=0, "no route between \"%s\" and \"%s\"", - src_father->name, dst_father->name); - - if (strcmp(src,e_route_cnt->src_gateway)) { - - latency_src = _get_latency(src, e_route_cnt->src_gateway); - xbt_assert(latency_src>=0, "no route between \"%s\" and \"%s\"", src, - e_route_cnt->src_gateway); - latency += latency_src; - } - - if (strcmp(e_route_cnt->dst_gateway,dst)) { - - latency_dst = _get_latency(e_route_cnt->dst_gateway, dst); - xbt_assert(latency_dst>=0, "no route between \"%s\" and \"%s\"", - e_route_cnt->dst_gateway, dst); - latency += latency_dst; - } - + _get_route_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) { + xbt_dynar_free(&global_routing->last_route); + global_routing->last_route = cleanup ? *route : NULL; } - - return latency; } /** @@ -814,24 +798,30 @@ static double _get_latency(const char *src, const char *dst) */ static xbt_dynar_t get_route(const char *src, const char *dst) { + xbt_dynar_t route = NULL; + get_route_latency(src, dst, &route, NULL, 1); + return route; +} - route_extended_t e_route = NULL; - - _get_route(src, dst, &e_route); - xbt_assert(e_route, "no route between \"%s\" and \"%s\"", src, dst); - - if (global_routing->last_route) - xbt_dynar_free(&(global_routing->last_route)); - global_routing->last_route = e_route->generic_route.link_list; - - if (e_route->src_gateway) - xbt_free(e_route->src_gateway); - if (e_route->dst_gateway) - xbt_free(e_route->dst_gateway); - - xbt_free(e_route); - - return global_routing->last_route; +/** + * \brief Generic method: find a route between hosts + * + * \param src the source host name + * \param dst the destination host name + * + * same as get_route, but return NULL if any exception is raised. + */ +static xbt_dynar_t get_route_or_null(const char *src, const char *dst) +{ + xbt_dynar_t route = NULL; + xbt_ex_t exception; + TRY { + get_route_latency(src, dst, &route, NULL, 1); + }CATCH(exception) { + xbt_ex_free(exception); + return NULL; + } + return route; } /** @@ -846,18 +836,16 @@ static xbt_dynar_t get_route(const char *src, const char *dst) */ static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) { - xbt_dynar_t d = get_route(src,dst); - global_routing->last_route = NULL; - return d; + xbt_dynar_t route = NULL; + get_route_latency(src, dst, &route, NULL, 0); + return route; } /*Get Latency*/ static double get_latency(const char *src, const char *dst) { - double latency = -1.0; - latency = _get_latency(src, dst); - xbt_assert(latency>=0.0, "no route between \"%s\" and \"%s\"", src, dst); + get_route_latency(src, dst, NULL, &latency, 0); return latency; } @@ -962,9 +950,11 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ global_routing = xbt_new0(s_routing_global_t, 1); global_routing->root = NULL; global_routing->get_route = get_route; + global_routing->get_route_or_null = get_route_or_null; global_routing->get_latency = get_latency; global_routing->get_route_no_cleanup = get_route_no_cleanup; global_routing->get_onelink_routes = get_onelink_routes; + global_routing->get_route_latency = get_route_latency; global_routing->get_network_element_type = get_network_element_type; global_routing->finalize = finalize; global_routing->loopback = loopback; @@ -1206,9 +1196,8 @@ route_extended_t generic_get_bypassroute(routing_component_t rc, 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) { - routing_component_t *tmp_src, *tmp_dst; - tmp_src = xbt_dynar_pop_ptr(path_src); - tmp_dst = xbt_dynar_pop_ptr(path_dst); + xbt_dynar_pop_ptr(path_src); + xbt_dynar_pop_ptr(path_dst); index_src--; index_dst--; current_src = xbt_dynar_get_ptr(path_src, index_src); @@ -1522,21 +1511,16 @@ void routing_parse_Scluster(void) char *cluster_prefix = A_surfxml_cluster_prefix; char *cluster_suffix = A_surfxml_cluster_suffix; char *cluster_radical = A_surfxml_cluster_radical; - char *cluster_power = A_surfxml_cluster_power; char *cluster_core = A_surfxml_cluster_core; - char *cluster_bw = A_surfxml_cluster_bw; - char *cluster_lat = A_surfxml_cluster_lat; - char *temp_cluster_bw = NULL; - char *temp_cluster_lat = NULL; - char *temp_cluster_power = NULL; char *cluster_bb_bw = A_surfxml_cluster_bb_bw; char *cluster_bb_lat = A_surfxml_cluster_bb_lat; - char *cluster_availability_file = A_surfxml_cluster_availability_file; - char *cluster_state_file = A_surfxml_cluster_state_file; + char *cluster_power = xbt_strdup(A_surfxml_cluster_power); + char *cluster_bw = xbt_strdup(A_surfxml_cluster_bw); + char *cluster_lat = xbt_strdup(A_surfxml_cluster_lat); char *host_id, *groups, *link_id = NULL; - char *router_id, *link_backbone; - char *availability_file = xbt_strdup(cluster_availability_file); - char *state_file = xbt_strdup(cluster_state_file); + char *router_id = xbt_strdup(A_surfxml_cluster_router_id); + char *availability_file = xbt_strdup(A_surfxml_cluster_availability_file); + char *state_file = xbt_strdup(A_surfxml_cluster_state_file); if(xbt_dict_size(patterns)==0) patterns = xbt_dict_new(); @@ -1545,9 +1529,11 @@ void routing_parse_Scluster(void) xbt_dict_set(patterns,"prefix",cluster_prefix,NULL); xbt_dict_set(patterns,"suffix",cluster_suffix,NULL); -#ifdef HAVE_PCRE_LIB + cluster_power = replace_random_parameter(cluster_power); + cluster_bw = replace_random_parameter(cluster_bw); + cluster_lat = replace_random_parameter(cluster_lat); + char *route_src_dst; -#endif unsigned int iter; int start, end, i; xbt_dynar_t radical_elements; @@ -1555,12 +1541,6 @@ void routing_parse_Scluster(void) int cluster_sharing_policy = AX_surfxml_cluster_sharing_policy; int cluster_bb_sharing_policy = AX_surfxml_cluster_bb_sharing_policy; -#ifndef HAVE_PCRE_LIB - xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), NULL); - char *route_src, *route_dst; - int j; -#endif - static unsigned int surfxml_buffer_stack_stack_ptr = 1; static unsigned int surfxml_buffer_stack_stack[1024]; @@ -1569,13 +1549,8 @@ void routing_parse_Scluster(void) surfxml_bufferstack_push(1); SURFXML_BUFFER_SET(AS_id, cluster_id); -#ifdef HAVE_PCRE_LIB SURFXML_BUFFER_SET(AS_routing, "RuleBased"); XBT_DEBUG("", cluster_id); -#else - SURFXML_BUFFER_SET(AS_routing, "Full"); - XBT_DEBUG("", cluster_id); -#endif SURFXML_START_TAG(AS); radical_elements = xbt_str_split(cluster_radical, ","); @@ -1583,42 +1558,32 @@ void routing_parse_Scluster(void) radical_ends = xbt_str_split(groups, "-"); switch (xbt_dynar_length(radical_ends)) { case 1: - surf_parse_get_int(&start, - xbt_dynar_get_as(radical_ends, 0, char *)); + surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *)); host_id = bprintf("%s%d%s", cluster_prefix, start, cluster_suffix); -#ifndef HAVE_PCRE_LIB - xbt_dynar_push_as(tab_elements_num, int, start); -#endif link_id = bprintf("%s_link_%d", cluster_id, start); xbt_dict_set(patterns, "radical", bprintf("%d", start), xbt_free); - temp_cluster_power = xbt_strdup(cluster_power); - temp_cluster_power = replace_random_parameter(temp_cluster_power); - XBT_DEBUG("", host_id, temp_cluster_power); + XBT_DEBUG("", host_id, cluster_power); A_surfxml_host_state = A_surfxml_host_state_ON; SURFXML_BUFFER_SET(host_id, host_id); - SURFXML_BUFFER_SET(host_power, temp_cluster_power); + SURFXML_BUFFER_SET(host_power, cluster_power); SURFXML_BUFFER_SET(host_core, cluster_core); SURFXML_BUFFER_SET(host_availability, "1.0"); SURFXML_BUFFER_SET(host_coordinates, ""); - xbt_free(availability_file); - availability_file = xbt_strdup(cluster_availability_file); - xbt_free(state_file); - state_file = xbt_strdup(cluster_state_file); - XBT_DEBUG("\tavailability_file=\"%s\"",xbt_str_varsubst(availability_file,patterns)); - XBT_DEBUG("\tstate_file=\"%s\"",xbt_str_varsubst(state_file,patterns)); - SURFXML_BUFFER_SET(host_availability_file, xbt_str_varsubst(availability_file,patterns)); - SURFXML_BUFFER_SET(host_state_file, xbt_str_varsubst(state_file,patterns)); + + char* tmp_availability_file = xbt_strdup(availability_file); + char* tmp_state_file = xbt_strdup(state_file); + XBT_DEBUG("\tavailability_file=\"%s\"",xbt_str_varsubst(tmp_availability_file,patterns)); + XBT_DEBUG("\tstate_file=\"%s\"",xbt_str_varsubst(tmp_state_file,patterns)); + SURFXML_BUFFER_SET(host_availability_file, xbt_str_varsubst(tmp_availability_file,patterns)); + SURFXML_BUFFER_SET(host_state_file, xbt_str_varsubst(tmp_state_file,patterns)); + xbt_free(tmp_availability_file); + xbt_free(tmp_state_file); XBT_DEBUG(""); SURFXML_START_TAG(host); SURFXML_END_TAG(host); - - temp_cluster_bw = xbt_strdup(cluster_bw); - temp_cluster_bw = replace_random_parameter(temp_cluster_bw); - temp_cluster_lat = xbt_strdup(cluster_lat); - temp_cluster_lat = replace_random_parameter(temp_cluster_lat); - XBT_DEBUG("", link_id,temp_cluster_bw, cluster_lat); + XBT_DEBUG("", link_id,cluster_bw, cluster_lat); A_surfxml_link_state = A_surfxml_link_state_ON; A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) @@ -1626,17 +1591,14 @@ void routing_parse_Scluster(void) if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE) {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;} SURFXML_BUFFER_SET(link_id, link_id); - SURFXML_BUFFER_SET(link_bandwidth, temp_cluster_bw); - SURFXML_BUFFER_SET(link_latency, temp_cluster_lat); + SURFXML_BUFFER_SET(link_bandwidth, cluster_bw); + SURFXML_BUFFER_SET(link_latency, cluster_lat); SURFXML_BUFFER_SET(link_bandwidth_file, ""); SURFXML_BUFFER_SET(link_latency_file, ""); SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); - xbt_free(temp_cluster_bw); - xbt_free(temp_cluster_lat); - xbt_free(temp_cluster_power); free(link_id); free(host_id); break; @@ -1648,40 +1610,30 @@ void routing_parse_Scluster(void) surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); for (i = start; i <= end; i++) { host_id = bprintf("%s%d%s", cluster_prefix, i, cluster_suffix); -#ifndef HAVE_PCRE_LIB - xbt_dynar_push_as(tab_elements_num, int, i); -#endif link_id = bprintf("%s_link_%d", cluster_id, i); xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free); - temp_cluster_power = xbt_strdup(cluster_power); - temp_cluster_power = replace_random_parameter(temp_cluster_power); - XBT_DEBUG("", host_id, temp_cluster_power); + XBT_DEBUG("", host_id, cluster_power); A_surfxml_host_state = A_surfxml_host_state_ON; SURFXML_BUFFER_SET(host_id, host_id); - SURFXML_BUFFER_SET(host_power, temp_cluster_power); + SURFXML_BUFFER_SET(host_power, cluster_power); SURFXML_BUFFER_SET(host_core, cluster_core); SURFXML_BUFFER_SET(host_availability, "1.0"); SURFXML_BUFFER_SET(host_coordinates, ""); - xbt_free(availability_file); - availability_file = xbt_strdup(cluster_availability_file); - xbt_free(state_file); - state_file = xbt_strdup(cluster_state_file); - XBT_DEBUG("\tavailability_file=\"%s\"",xbt_str_varsubst(availability_file,patterns)); - XBT_DEBUG("\tstate_file=\"%s\"",xbt_str_varsubst(state_file,patterns)); - SURFXML_BUFFER_SET(host_availability_file, xbt_str_varsubst(availability_file,patterns)); - SURFXML_BUFFER_SET(host_state_file, xbt_str_varsubst(state_file,patterns)); + + char* tmp_availability_file = xbt_strdup(availability_file); + char* tmp_state_file = xbt_strdup(state_file); + XBT_DEBUG("\tavailability_file=\"%s\"",xbt_str_varsubst(tmp_availability_file,patterns)); + XBT_DEBUG("\tstate_file=\"%s\"",xbt_str_varsubst(tmp_state_file,patterns)); + SURFXML_BUFFER_SET(host_availability_file, xbt_str_varsubst(tmp_availability_file,patterns)); + SURFXML_BUFFER_SET(host_state_file, xbt_str_varsubst(tmp_state_file,patterns)); + xbt_free(tmp_availability_file); + xbt_free(tmp_state_file); XBT_DEBUG(""); SURFXML_START_TAG(host); SURFXML_END_TAG(host); - xbt_free(temp_cluster_power); - - temp_cluster_bw = xbt_strdup(cluster_bw); - temp_cluster_bw = replace_random_parameter(temp_cluster_bw); - temp_cluster_lat = xbt_strdup(cluster_lat); - temp_cluster_lat = replace_random_parameter(temp_cluster_lat); - XBT_DEBUG("", link_id,temp_cluster_bw, cluster_lat); + XBT_DEBUG("", link_id,cluster_bw, cluster_lat); A_surfxml_link_state = A_surfxml_link_state_ON; A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) @@ -1689,16 +1641,14 @@ void routing_parse_Scluster(void) if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE) {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;} SURFXML_BUFFER_SET(link_id, link_id); - SURFXML_BUFFER_SET(link_bandwidth, temp_cluster_bw); - SURFXML_BUFFER_SET(link_latency, temp_cluster_lat); + SURFXML_BUFFER_SET(link_bandwidth, cluster_bw); + SURFXML_BUFFER_SET(link_latency, cluster_lat); SURFXML_BUFFER_SET(link_bandwidth_file, ""); SURFXML_BUFFER_SET(link_latency_file, ""); SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); - xbt_free(temp_cluster_bw); - xbt_free(temp_cluster_lat); free(link_id); free(host_id); } @@ -1706,6 +1656,7 @@ void routing_parse_Scluster(void) default: XBT_DEBUG("Malformed radical"); + break; } xbt_dynar_free(&radical_ends); @@ -1713,11 +1664,8 @@ void routing_parse_Scluster(void) xbt_dynar_free(&radical_elements); XBT_DEBUG(" "); - router_id = - bprintf("%s%s_router%s", cluster_prefix, cluster_id, - cluster_suffix); - //link_router = bprintf("%s_link_%s_router", cluster_id, cluster_id); - link_backbone = bprintf("%s_backbone", cluster_id); + if(!strcmp(router_id,"")) + router_id = bprintf("%s%s_router%s", cluster_prefix, cluster_id, cluster_suffix); XBT_DEBUG("", router_id); SURFXML_BUFFER_SET(router_id, router_id); @@ -1725,31 +1673,8 @@ void routing_parse_Scluster(void) SURFXML_START_TAG(router); SURFXML_END_TAG(router); - //TODO -// xbt_dict_set(patterns, "radical", xbt_strdup("_router"), xbt_free); -// temp_cluster_bw = xbt_strdup(cluster_bw); -// temp_cluster_bw = replace_random_parameter(temp_cluster_bw); -// temp_cluster_lat = xbt_strdup(cluster_lat); -// temp_cluster_lat = replace_random_parameter(temp_cluster_lat); -// XBT_DEBUG("", link_router,temp_cluster_bw, temp_cluster_lat); -// A_surfxml_link_state = A_surfxml_link_state_ON; -// A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; -// if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) -// {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;} -// if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE) -// {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;} -// SURFXML_BUFFER_SET(link_id, link_router); -// SURFXML_BUFFER_SET(link_bandwidth, temp_cluster_bw); -// SURFXML_BUFFER_SET(link_latency, temp_cluster_lat); -// SURFXML_BUFFER_SET(link_bandwidth_file, ""); -// SURFXML_BUFFER_SET(link_latency_file, ""); -// SURFXML_BUFFER_SET(link_state_file, ""); -// SURFXML_START_TAG(link); -// SURFXML_END_TAG(link); - -// xbt_free(temp_cluster_bw); -// xbt_free(temp_cluster_lat); - + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ + char *link_backbone = bprintf("%s_backbone", cluster_id); XBT_DEBUG("", link_backbone,cluster_bb_bw, cluster_bb_lat); A_surfxml_link_state = A_surfxml_link_state_ON; A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; @@ -1763,10 +1688,11 @@ void routing_parse_Scluster(void) SURFXML_BUFFER_SET(link_state_file, ""); SURFXML_START_TAG(link); SURFXML_END_TAG(link); + free(link_backbone); + } XBT_DEBUG(" "); -#ifdef HAVE_PCRE_LIB char *new_suffix = xbt_strdup(""); radical_elements = xbt_str_split(cluster_suffix, "."); @@ -1779,7 +1705,7 @@ void routing_parse_Scluster(void) } route_src_dst = bprintf("%s(.*)%s", cluster_prefix, new_suffix); xbt_dynar_free(&radical_elements); - free(new_suffix); + xbt_free(new_suffix); char *pcre_link_src = bprintf("%s_link_$1src", cluster_id); char *pcre_link_backbone = bprintf("%s_backbone", cluster_id); @@ -1793,11 +1719,13 @@ void routing_parse_Scluster(void) A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ XBT_DEBUG("", pcre_link_backbone); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + } XBT_DEBUG(""); SURFXML_END_TAG(route); @@ -1818,11 +1746,13 @@ void routing_parse_Scluster(void) SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ XBT_DEBUG("", pcre_link_backbone); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + } XBT_DEBUG(""); SURFXML_END_TAG(route); @@ -1835,11 +1765,13 @@ void routing_parse_Scluster(void) A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; SURFXML_START_TAG(route); + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ XBT_DEBUG("", pcre_link_backbone); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + } XBT_DEBUG("", pcre_link_dst); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); @@ -1868,11 +1800,13 @@ void routing_parse_Scluster(void) SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + if(strcmp(cluster_bb_bw,"") && strcmp(cluster_bb_lat,"")){ XBT_DEBUG("", pcre_link_backbone); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_backbone); A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; SURFXML_START_TAG(link_ctn); SURFXML_END_TAG(link_ctn); + } XBT_DEBUG("", pcre_link_dst); SURFXML_BUFFER_SET(link_ctn_id, pcre_link_dst); @@ -1889,82 +1823,15 @@ void routing_parse_Scluster(void) free(pcre_link_backbone); free(pcre_link_src); free(route_src_dst); -#else - for (i = 0; i <= xbt_dynar_length(tab_elements_num); i++) { - for (j = 0; j <= xbt_dynar_length(tab_elements_num); j++) { - if (i == xbt_dynar_length(tab_elements_num)) { - route_src = router_id; - } else { - route_src = - bprintf("%s%d%s", cluster_prefix, - xbt_dynar_get_as(tab_elements_num, i, int), - cluster_suffix); - } - - if (j == xbt_dynar_length(tab_elements_num)) { - route_dst = router_id; - } else { - route_dst = - bprintf("%s%d%s", cluster_prefix, - xbt_dynar_get_as(tab_elements_num, j, int), - cluster_suffix); - } - - XBT_DEBUG(""); - SURFXML_BUFFER_SET(route_src, route_src); - SURFXML_BUFFER_SET(route_dst, route_dst); - A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; - SURFXML_START_TAG(route); - - if (i != xbt_dynar_length(tab_elements_num)){ - route_src = - bprintf("%s_link_%d", cluster_id, - xbt_dynar_get_as(tab_elements_num, i, int)); - XBT_DEBUG("", route_src); - SURFXML_BUFFER_SET(link_ctn_id, route_src); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) - {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_UP;} - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - free(route_src); - } - - XBT_DEBUG("", cluster_id); - SURFXML_BUFFER_SET(link_ctn_id, bprintf("%s_backbone", cluster_id)); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - - if (j != xbt_dynar_length(tab_elements_num)) { - route_dst = - bprintf("%s_link_%d", cluster_id, - xbt_dynar_get_as(tab_elements_num, j, int)); - XBT_DEBUG("", route_dst); - SURFXML_BUFFER_SET(link_ctn_id, route_dst); - A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_NONE; - if(cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX) - {A_surfxml_link_ctn_direction = A_surfxml_link_ctn_direction_DOWN;} - SURFXML_START_TAG(link_ctn); - SURFXML_END_TAG(link_ctn); - free(route_dst); - } - - XBT_DEBUG(""); - SURFXML_END_TAG(route); - } - } - xbt_dynar_free(&tab_elements_num); -#endif + xbt_free(cluster_bw); + xbt_free(cluster_lat); + xbt_free(cluster_power); + xbt_free(availability_file); + xbt_free(state_file); - free(router_id); - free(link_backbone); - //free(link_router); + xbt_free(router_id); xbt_dict_free(&patterns); - free(availability_file); - free(state_file); XBT_DEBUG(""); SURFXML_END_TAG(AS); @@ -2049,6 +1916,7 @@ static void routing_parse_Speer(void) SURFXML_BUFFER_SET(host_availability_file, peer_availability_file); SURFXML_BUFFER_SET(host_state_file, peer_state_file); SURFXML_BUFFER_SET(host_coordinates, ""); + SURFXML_BUFFER_SET(host_core, "1.0"); SURFXML_START_TAG(host); SURFXML_END_TAG(host); @@ -2225,6 +2093,7 @@ static void routing_parse_Srandom(void) break; default: XBT_INFO("Malformed radical"); + break; } res = random_generate(random); rd_name = bprintf("%s_router",random_id);