X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/efbaa7f3050b349e41f3051b751f53b0b24e111d..ea97700f4d2ec9adfcd537e8a86e6d146c50a37c:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 101626c1a2..658d80c5e4 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -32,12 +32,11 @@ int ROUTING_ASR_LEVEL; //Routing level int COORD_ASR_LEVEL; //Coordinates level int NS3_ASR_LEVEL; //host node for ns3 -static xbt_dict_t patterns = NULL; static xbt_dict_t random_value = NULL; /* Global vars */ routing_global_t global_routing = NULL; -routing_component_t current_routing = NULL; +AS_t current_routing = NULL; routing_model_description_t current_routing_model = NULL; /* global parse functions */ @@ -294,7 +293,7 @@ static void routing_parse_E_bypassRoute(void) */ void routing_AS_begin(const char *AS_id, const char *wanted_routing_type) { - routing_component_t new_routing; + AS_t new_routing; routing_model_description_t model = NULL; int cpt; @@ -313,7 +312,7 @@ void routing_AS_begin(const char *AS_id, const char *wanted_routing_type) } /* make a new routing component */ - new_routing = (routing_component_t) (*(model->create)) (); + new_routing = (AS_t) (*(model->create)) (); new_routing->routing = model; new_routing->hierarchy = SURF_ROUTING_NULL; new_routing->name = xbt_strdup(AS_id); @@ -382,24 +381,6 @@ void routing_AS_end() /* Aux Business methods */ -/** - * \brief Get the AS name of the element - * - * \param name the host name - * - */ -static char *elements_As_name(const char *name) -{ - routing_component_t as_comp; - - /* (1) find the as where the host is located */ - as_comp = ((network_element_info_t) - xbt_lib_get_or_null(host_lib, name, - ROUTING_HOST_LEVEL))->rc_component; - return as_comp->name; -} - - /** * \brief Get the AS father and the first elements of the chain * @@ -410,21 +391,21 @@ static char *elements_As_name(const char *name) * father in the chain */ 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) + AS_t * res_father, + AS_t * res_src, + AS_t * res_dst) { xbt_assert(src && dst, "bad parameters for \"elements_father\" method"); #define ELEMENTS_FATHER_MAXDEPTH 16 /* increase if it is not enough */ - routing_component_t src_as, dst_as; - routing_component_t path_src[ELEMENTS_FATHER_MAXDEPTH]; - routing_component_t path_dst[ELEMENTS_FATHER_MAXDEPTH]; + AS_t src_as, dst_as; + AS_t path_src[ELEMENTS_FATHER_MAXDEPTH]; + AS_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; + AS_t current; + AS_t current_src; + AS_t current_dst; + AS_t father; /* (1) find the as where the src and dst are located */ network_element_info_t src_data = xbt_lib_get_or_null(host_lib, src, @@ -492,9 +473,9 @@ static void _get_route_latency(const char *src, const char *dst, 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; + AS_t common_father; + AS_t src_father; + AS_t dst_father; elements_father(src, dst, &common_father, &src_father, &dst_father); if (src_father == dst_father) { /* SURF_ROUTING_BASE */ @@ -679,9 +660,7 @@ static xbt_dynar_t get_route_no_cleanup(const char *src, const char *dst) return route; } -/*Get Latency*/ -static double get_latency(const char *src, const char *dst) -{ +static double get_latency(const char *src, const char *dst) { double latency = -1.0; get_route_latency(src, dst, NULL, &latency, 0); return latency; @@ -695,23 +674,17 @@ static double get_latency(const char *src, const char *dst) * This fuction is call by "finalize". It allow to finalize the * AS or routing components. It delete all the structures. */ -static void _finalize(routing_component_t rc) -{ - if (rc) { - xbt_dict_cursor_t cursor = NULL; - char *key; - routing_component_t elem; - xbt_dict_foreach(rc->routing_sons, cursor, key, elem) { - _finalize(elem); - } - xbt_dict_t tmp_sons = rc->routing_sons; - char *tmp_name = rc->name; - xbt_dict_free(&tmp_sons); - xbt_free(tmp_name); - xbt_assert(rc->finalize, "no defined method \"finalize\" in \"%s\"", - current_routing->name); - (*(rc->finalize)) (rc); - } +static void finalize_rec(AS_t as) { + xbt_dict_cursor_t cursor = NULL; + char *key; + AS_t elem; + + xbt_dict_foreach(as->routing_sons, cursor, key, elem) + finalize_rec(elem); + + xbt_dict_free(&as->routing_sons); + xbt_free(as->name); + as->finalize(as); } /** @@ -720,17 +693,13 @@ static void _finalize(routing_component_t rc) * walk through the routing components tree and delete the structures * by calling the different "finalize" functions in each routing component */ -static void finalize(void) -{ - /* delete recursively all the tree */ - _finalize(global_routing->root); - /* delete last_route */ - xbt_dynar_free(&(global_routing->last_route)); - /* delete global routing structure */ +static void finalize(void) { + finalize_rec(global_routing->root); + xbt_dynar_free(&global_routing->last_route); xbt_free(global_routing); } -static xbt_dynar_t recursive_get_onelink_routes(routing_component_t rc) +static xbt_dynar_t recursive_get_onelink_routes(AS_t rc) { xbt_dynar_t ret = xbt_dynar_new(sizeof(onelink_t), xbt_free); @@ -746,7 +715,7 @@ static xbt_dynar_t recursive_get_onelink_routes(routing_component_t rc) //recursing char *key; xbt_dict_cursor_t cursor = NULL; - routing_component_t rc_child; + AS_t rc_child; xbt_dict_foreach(rc->routing_sons, cursor, key, rc_child) { xbt_dynar_t onelink_child = recursive_get_onelink_routes(rc_child); if (onelink_child) { @@ -854,14 +823,14 @@ void routing_model_create(size_t size_of_links, void *loopback) static void routing_parse_cluster(void) { char *host_id, *groups, *link_id = NULL; + xbt_dict_t patterns = NULL; s_sg_platf_host_cbarg_t host; s_sg_platf_link_cbarg_t link; if (strcmp(struct_cluster->availability_trace, "") || strcmp(struct_cluster->state_trace, "")) { - if (xbt_dict_size(patterns) == 0) - patterns = xbt_dict_new(); + patterns = xbt_dict_new(); xbt_dict_set(patterns, "id", xbt_strdup(struct_cluster->id), free); xbt_dict_set(patterns, "prefix", xbt_strdup(struct_cluster->prefix), free); xbt_dict_set(patterns, "suffix", xbt_strdup(struct_cluster->suffix), free); @@ -905,8 +874,7 @@ static void routing_parse_cluster(void) if (strcmp(struct_cluster->availability_trace, "")) { xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free); char *tmp_availability_file = - xbt_strdup(struct_cluster->availability_trace); - xbt_str_varsubst(tmp_availability_file, patterns); + xbt_str_varsubst(struct_cluster->availability_trace, patterns); XBT_DEBUG("\tavailability_file=\"%s\"", tmp_availability_file); host.power_trace = tmgr_trace_new(tmp_availability_file); xbt_free(tmp_availability_file); @@ -914,8 +882,8 @@ static void routing_parse_cluster(void) XBT_DEBUG("\tavailability_file=\"\""); } if (strcmp(struct_cluster->state_trace, "")) { - char *tmp_state_file = xbt_strdup(struct_cluster->state_trace); - xbt_str_varsubst(tmp_state_file, patterns); + char *tmp_state_file = + xbt_str_varsubst(struct_cluster->state_trace, patterns); XBT_DEBUG("\tstate_file=\"%s\"", tmp_state_file); host.state_trace = tmgr_trace_new(tmp_state_file); xbt_free(tmp_state_file); @@ -1052,43 +1020,14 @@ static void routing_parse_cluster(void) xbt_dynar_free(&radical_elements); xbt_free(new_suffix); - if (strcmp(struct_cluster->availability_trace, "") - || strcmp(struct_cluster->state_trace, "")) - xbt_dict_free(&patterns); - XBT_DEBUG(""); sg_platf_new_AS_end(); XBT_DEBUG(" "); + xbt_dict_free(&patterns); // no op if it were never set } -/* - * This function take a string and replace parameters from patterns dict. - * It returns the new value. - */ -static char *replace_random_parameter(char *string) -{ - char *test_string = NULL; - - if (xbt_dict_size(random_value) == 0) - return string; - - string = xbt_str_varsubst(string, patterns); // for patterns of cluster - test_string = bprintf("${%s}", string); - test_string = xbt_str_varsubst(test_string, random_value); //Add ${xxxxx} for random Generator - - if (strcmp(test_string, "")) { //if not empty, keep this value. - xbt_free(string); - string = test_string; - } //In other case take old value (without ${}) - else - free(test_string); - return string; -} - -static void routing_parse_postparse(void) -{ +static void routing_parse_postparse(void) { xbt_dict_free(&random_value); - xbt_dict_free(&patterns); } static void routing_parse_peer(sg_platf_peer_cbarg_t peer)