X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e1ca44fbde5157f4302e3bac006914db59077fa9..62da5664b681577c99a3b0f51d8395876e7ecdf5:/src/surf/surf_routing.c?ds=sidebyside diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 526fdfd649..2ac012e27b 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -220,8 +220,7 @@ static void parse_S_host(const char *host_id, const char* coord) network_element_info_t info = NULL; if (current_routing->hierarchy == SURF_ROUTING_NULL) current_routing->hierarchy = SURF_ROUTING_BASE; - xbt_assert1(!xbt_dict_get_or_null - (global_routing->where_network_elements, host_id), + xbt_assert1(!xbt_lib_get_or_null(host_lib, host_id,ROUTING_HOST_LEVEL), "Reading a host, processing unit \"%s\" already exists", host_id); xbt_assert1(current_routing->set_processing_unit, @@ -231,8 +230,7 @@ static void parse_S_host(const char *host_id, const char* coord) info = xbt_new0(s_network_element_info_t, 1); info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_HOST; - xbt_dict_set(global_routing->where_network_elements, host_id, - (void *) info, xbt_free); + xbt_lib_set(host_lib,host_id,ROUTING_HOST_LEVEL,(void *) info); if (strcmp(coord,"")) { xbt_dynar_t ctn = xbt_str_split_str(coord, " "); xbt_dynar_shrink(ctn, 0); @@ -275,34 +273,48 @@ static void parse_S_host_lua(const char *host_id, const char *coord) /** * \brief Add a "router" to the network element list */ -static void parse_S_router(void) +static void parse_S_router(const char *router_id) { network_element_info_t info = NULL; if (current_routing->hierarchy == SURF_ROUTING_NULL) current_routing->hierarchy = SURF_ROUTING_BASE; - xbt_assert1(!xbt_dict_get_or_null - (global_routing->where_network_elements, - A_surfxml_router_id), + xbt_assert1(!xbt_lib_get_or_null(as_router_lib,A_surfxml_router_id, ROUTING_ASR_LEVEL), "Reading a router, processing unit \"%s\" already exists", - A_surfxml_router_id); + router_id); xbt_assert1(current_routing->set_processing_unit, "no defined method \"set_processing_unit\" in \"%s\"", current_routing->name); (*(current_routing->set_processing_unit)) (current_routing, - A_surfxml_router_id); + router_id); info = xbt_new0(s_network_element_info_t, 1); info->rc_component = current_routing; info->rc_type = SURF_NETWORK_ELEMENT_ROUTER; - xbt_dict_set(global_routing->where_network_elements, A_surfxml_router_id, - (void *) info, xbt_free); + + xbt_lib_set(as_router_lib,router_id,ROUTING_ASR_LEVEL,(void *) info); if (strcmp(A_surfxml_router_coordinates,"")) { - xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " "); - xbt_dynar_shrink(ctn, 0); - xbt_dict_set(coordinates, A_surfxml_router_id, ctn, xbt_dynar_free_voidp); + xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " "); + xbt_dynar_shrink(ctn, 0); + xbt_lib_set(as_router_lib,router_id,COORD_ASR_LEVEL,(void *) ctn); } } +/** + * brief Add a "router" to the network element list from XML description + */ +static void parse_S_router_XML(void) +{ + return parse_S_router(A_surfxml_router_id); +} + +/** + * brief Add a "router" to the network element list from XML description + */ +static void parse_S_router_lua(const char* router_id) +{ + return parse_S_router(router_id); +} + /** * \brief Set the endponints for a route */ @@ -578,15 +590,13 @@ static void parse_E_AS(const char *AS_id) THROW1(arg_error, 0, "Close AS(%s), that never open", AS_id); } else { network_element_info_t info = NULL; - xbt_assert1(!xbt_dict_get_or_null - (global_routing->where_network_elements, - current_routing->name), "The AS \"%s\" already exists", - current_routing->name); + xbt_assert1(!xbt_lib_get_or_null(as_router_lib,current_routing->name, ROUTING_ASR_LEVEL), + "The AS \"%s\" already exists",current_routing->name); info = xbt_new0(s_network_element_info_t, 1); info->rc_component = current_routing->routing_father; info->rc_type = SURF_NETWORK_ELEMENT_AS; - xbt_dict_set(global_routing->where_network_elements, - current_routing->name, info, xbt_free); + xbt_lib_set(as_router_lib,current_routing->name,ROUTING_ASR_LEVEL,(void *) info); + (*(current_routing->routing->unload)) (); (*(current_routing->routing->end)) (); current_routing = current_routing->routing_father; @@ -625,8 +635,7 @@ static char* elements_As_name(const char *name) /* (1) find the as where the host is located */ as_comp = ((network_element_info_t) - xbt_dict_get_or_null(global_routing->where_network_elements, - name))->rc_component; + xbt_lib_get_or_null(host_lib,name, ROUTING_HOST_LEVEL))->rc_component; return as_comp->name; } @@ -657,12 +666,13 @@ static xbt_dynar_t elements_father(const char *src, const char *dst) routing_component_t *father = NULL; /* (1) find the as where the src and dst are located */ - src_as = ((network_element_info_t) - xbt_dict_get_or_null(global_routing->where_network_elements, - src))->rc_component; - dst_as = ((network_element_info_t) - xbt_dict_get_or_null(global_routing->where_network_elements, - dst))->rc_component; + 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_assert2(src_as && dst_as, "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, @@ -1027,8 +1037,6 @@ static void finalize(void) { /* delete recursibly all the tree */ _finalize(global_routing->root); - /* delete "where" dict */ - xbt_dict_free(&(global_routing->where_network_elements)); xbt_dict_free(&(coordinates)); /* delete last_route */ xbt_dynar_free(&(global_routing->last_route)); @@ -1073,9 +1081,14 @@ e_surf_network_element_type_t get_network_element_type(const char *name) { network_element_info_t rc = NULL; - rc = xbt_dict_get_or_null(global_routing->where_network_elements, name); - if(!rc) return SURF_NETWORK_ELEMENT_NULL; - return rc->rc_type; + + rc = xbt_lib_get_or_null(host_lib, name, ROUTING_HOST_LEVEL); + if(rc) return rc->rc_type; + + rc = xbt_lib_get_or_null(as_router_lib, name, ROUTING_ASR_LEVEL); + if(rc) return rc->rc_type; + + return SURF_NETWORK_ELEMENT_NULL; } /** @@ -1087,7 +1100,6 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ { /* config the uniq global routing */ global_routing = xbt_new0(s_routing_global_t, 1); - global_routing->where_network_elements = xbt_dict_new(); global_routing->root = NULL; global_routing->get_route = get_route; global_routing->get_latency = get_latency; @@ -1107,7 +1119,7 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ /* parse generic elements */ surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML); surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML); - surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router); + surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router_XML); surfxml_add_callback(STag_surfxml_route_cb_list, &parse_S_route_new_and_endpoints_XML); @@ -2979,11 +2991,9 @@ static route_extended_t generic_get_bypassroute(routing_component_t rc, /* (1) find the as where the src and dst are located */ src_as = ((network_element_info_t) - xbt_dict_get_or_null(global_routing->where_network_elements, - src))->rc_component; + xbt_lib_get_or_null(host_lib, src, ROUTING_HOST_LEVEL))->rc_component; dst_as = ((network_element_info_t) - xbt_dict_get_or_null(global_routing->where_network_elements, - dst))->rc_component; + xbt_lib_get_or_null(host_lib, dst, ROUTING_HOST_LEVEL))->rc_component; xbt_assert2(src_as && dst_as, "Ask for route \"from\"(%s) or \"to\"(%s) no found", src, @@ -3241,9 +3251,7 @@ generic_autonomous_system_exist(routing_component_t rc, char *element) xbt_dict_cursor_t cursor = NULL; char *key; element_as = ((network_element_info_t) - xbt_dict_get_or_null - (global_routing->where_network_elements, - element))->rc_component; + xbt_lib_get_or_null(as_router_lib, element, ROUTING_ASR_LEVEL))->rc_component; result = ((routing_component_t) - 1); if (element_as != rc) result = generic_as_exist(rc, element_as); @@ -3266,9 +3274,8 @@ generic_processing_units_exist(routing_component_t rc, char *element) { routing_component_t element_as; element_as = ((network_element_info_t) - xbt_dict_get_or_null - (global_routing->where_network_elements, - element))->rc_component; + xbt_lib_get_or_null(host_lib, + element, ROUTING_HOST_LEVEL))->rc_component; if (element_as == rc) return element_as; return generic_as_exist(rc, element_as); @@ -3277,26 +3284,25 @@ generic_processing_units_exist(routing_component_t rc, char *element) static void generic_src_dst_check(routing_component_t rc, const char *src, const char *dst) { - #ifndef NDEBUG - routing_component_t src_as = ((network_element_info_t) - xbt_dict_get_or_null - (global_routing->where_network_elements, - src))->rc_component; - routing_component_t dst_as = ((network_element_info_t) - xbt_dict_get_or_null - (global_routing->where_network_elements, - dst))->rc_component; - - xbt_assert3(src_as != NULL && dst_as != NULL, - "Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src, dst, rc->name); - xbt_assert4(src_as == dst_as, - "The src(%s in %s) and dst(%s in %s) are in differents AS", + + 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); + + if(src_data == NULL || dst_data == NULL) + xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", + src, dst, rc->name); + + routing_component_t src_as = ((network_element_info_t)src_data)->rc_component; + routing_component_t dst_as = ((network_element_info_t)dst_data)->rc_component; + + if(src_as != dst_as) + xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS", src, src_as->name, dst, dst_as->name); - xbt_assert2(rc == dst_as, - "The routing component of src and dst is not the same as the network elements belong (%s==%s)", - rc->name, dst_as->name); -#endif + if(rc != dst_as) + xbt_die("The routing component of src and dst is not the same as the network elements belong (%s==%s)", + rc->name, dst_as->name); } static void routing_parse_Sconfig(void)