X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/04cb6e6a844ba34246d7ba001452f8aeaed9a6f9..fc1551b7a3cbbcdb9fb48500f70683318c87c47b:/src/surf/surf_routing.c diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index c9fb2c5516..4a4077e4b2 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -1,10 +1,13 @@ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009, 2010, 2011. The SimGrid Team. * All rights reserved. */ /* 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. */ #include /* regular expression library */ + +#include "simgrid/platf_interface.h" // platform creation API internal interface + #include "surf_routing_private.h" #include "surf/surf_routing.h" #include "surf/surfxml_parse_values.h" @@ -52,9 +55,6 @@ static void routing_parse_Speer(void); /* peer bypass */ static void routing_parse_Srandom(void); /* random bypass */ static void routing_parse_Erandom(void); /* random bypass */ -static void routing_parse_Sconfig(void); /* config Tag */ -static void routing_parse_Econfig(void); /* config Tag */ - static char* replace_random_parameter(char * chaine); static void clean_routing_after_parse(void); @@ -186,11 +186,9 @@ static void parse_E_host(void) /* * \brief Add a host to the network element list from XML */ -static void parse_S_host_XML(void) +static void parse_S_host_XML(surf_parsing_host_arg_t h) { -// XBT_INFO("parse_S_host_XML"); -// XBT_INFO("'%s' '%s'",struct_host->V_host_id, struct_host->V_host_coord); - parse_S_host(struct_host->V_host_id, struct_host->V_host_coord); + parse_S_host(h->V_host_id, h->V_host_coord); } static void parse_E_host_XML(void) { @@ -421,16 +419,26 @@ static void parse_E_bypassRoute_store_route(void) } /** - * \brief Make a new routing component + * \brief Make a new routing component to the platform + * + * Add a new autonomous system to the platform. Any elements (such as host, + * router or sub-AS) added after this call and before the corresponding call + * to sg_platf_new_AS_close() will be added to this AS. + * + * Once this function was called, the configuration concerning the used + * models cannot be changed anymore. * - * make the new structure and - * set the parsing functions to allows parsing the part of the routing tree + * @param AS_id name of this autonomous system. Must be uniq in the platform + * @param wanted_routing_type one of Full, Floyd, Dijkstra or similar. Full list in the variable routing_models, in src/surf/surf_routing.c */ -void routing_AS_init(const char *AS_id, const char *wanted_routing_type) +void sg_platf_new_AS_open(const char *AS_id, const char *wanted_routing_type) { routing_component_t new_routing; model_type_t model = NULL; int cpt; + + surf_parse_models_setup(); /* ensure that the models are created after the last tag and before the first -like */ + /* search the routing model */ for (cpt = 0; routing_models[cpt].name; cpt++) if (!strcmp(wanted_routing_type, routing_models[cpt].name)) @@ -489,26 +497,21 @@ void routing_AS_init(const char *AS_id, const char *wanted_routing_type) current_routing = new_routing; } -/* - * Detect the routing model type of the routing component from XML platforms - */ -static void parse_S_AS(void) -{ - routing_AS_init(A_surfxml_AS_id, A_surfxml_AS_routing); -} - - /** - * \brief Finish the creation of a new routing component + * \brief Specify that the current description of AS is finished + * + * Once you've declared all the content of your AS, you have to close + * it with this call. Your AS is not usable until you call this function. + * + * @fixme: this call is not as robust as wanted: bad things WILL happen + * if you call it twice for the same AS, or if you forget calling it, or + * even if you add stuff to a closed AS * - * When you finish to read the routing component, other structures must be created. - * the "end" method allow to do that for any routing model type */ -void routing_AS_end(const char *AS_id) -{ +void sg_platf_new_AS_close() { if (current_routing == NULL) { - THROWF(arg_error, 0, "Close AS(%s), that were never opened", AS_id); + THROWF(arg_error, 0, "Close an AS, but none was under construction"); } else { network_element_info_t info = NULL; xbt_assert(!xbt_lib_get_or_null(as_router_lib,current_routing->name, ROUTING_ASR_LEVEL), @@ -526,14 +529,6 @@ void routing_AS_end(const char *AS_id) } } -/* - * \brief Finish the creation of a new routing component from XML - */ -static void parse_E_AS(void) -{ - routing_AS_end(A_surfxml_AS_id); -} - /* Aux Business methods */ /** @@ -972,7 +967,7 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ current_routing = NULL; /* parse generic elements */ - surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML); + surf_parse_host_add_cb(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_XML); @@ -993,9 +988,6 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ surfxml_add_callback(ETag_surfxml_bypassRoute_cb_list, &parse_E_bypassRoute_store_route); - surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_S_AS); - surfxml_add_callback(ETag_surfxml_AS_cb_list, &parse_E_AS); - surfxml_add_callback(STag_surfxml_cluster_cb_list, &routing_parse_Scluster); @@ -1012,8 +1004,6 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ void surf_parse_add_callback_config(void) { - surfxml_add_callback(STag_surfxml_config_cb_list, &routing_parse_Sconfig); - surfxml_add_callback(ETag_surfxml_config_cb_list, &routing_parse_Econfig); surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties_XML); surfxml_add_callback(STag_surfxml_random_cb_list, &routing_parse_Srandom); } @@ -1479,31 +1469,12 @@ void generic_src_dst_check(routing_component_t rc, const char *src, src,dst,src_as->name, dst_as->name,rc->name); } -static void routing_parse_Sconfig(void) -{ - XBT_DEBUG("START configuration name = %s",A_surfxml_config_id); -} - -static void routing_parse_Econfig(void) -{ - xbt_dict_cursor_t cursor = NULL; - char *key; - char *elem; - char *cfg; - xbt_dict_foreach(current_property_set, cursor, key, elem) { - cfg = bprintf("%s:%s",key,elem); - if(xbt_cfg_is_default_value(_surf_cfg_set, key)) - xbt_cfg_set_parse(_surf_cfg_set, cfg); - else - XBT_INFO("The custom configuration '%s' is already defined by user!",key); - free(cfg); - } - XBT_DEBUG("End configuration name = %s",A_surfxml_config_id); -} static void parse_create_host_link(int i) { char *host_id, *link_id = NULL; + s_surf_parsing_host_arg_t host; + memset(&host,0,sizeof(host)); host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix); link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i); @@ -1511,14 +1482,13 @@ static void parse_create_host_link(int i) A_surfxml_host_state = A_surfxml_host_state_ON; XBT_DEBUG("", host_id, struct_cluster->S_cluster_power); - struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1); - struct_host->V_host_id = xbt_strdup(host_id); + host.V_host_id = xbt_strdup(host_id); if(strcmp(struct_cluster->V_cluster_availability_file,"")){ xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free); char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file); xbt_str_varsubst(tmp_availability_file,patterns); XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file); - struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file); + host.V_host_power_trace = tmgr_trace_new(tmp_availability_file); xbt_free(tmp_availability_file); } else @@ -1529,7 +1499,7 @@ static void parse_create_host_link(int i) char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file); xbt_str_varsubst(tmp_state_file,patterns); XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file); - struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file); + host.V_host_state_trace = tmgr_trace_new(tmp_state_file); xbt_free(tmp_state_file); } else @@ -1537,12 +1507,12 @@ static void parse_create_host_link(int i) XBT_DEBUG("\tstate_file=\"\""); } - struct_host->V_host_power_peak = struct_cluster->S_cluster_power; - struct_host->V_host_power_scale = 1.0; - struct_host->V_host_core = struct_cluster->S_cluster_core; - struct_host->V_host_state_initial = SURF_RESOURCE_ON; - struct_host->V_host_coord = ""; - surf_parse_host(); + host.V_host_power_peak = struct_cluster->S_cluster_power; + host.V_host_power_scale = 1.0; + host.V_host_core = struct_cluster->S_cluster_core; + host.V_host_state_initial = SURF_RESOURCE_ON; + host.V_host_coord = ""; + sg_platf_new_host(&host); XBT_DEBUG(""); A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; @@ -1604,6 +1574,8 @@ void routing_parse_Scluster(void) static int AX_ptr = 0; char *host_id, *groups, *link_id = NULL; + s_surf_parsing_host_arg_t host; + if( strcmp(struct_cluster->V_cluster_availability_file,"") || strcmp(struct_cluster->V_cluster_state_file,"") ) { @@ -1633,22 +1605,23 @@ void routing_parse_Scluster(void) //Make all hosts radical_elements = xbt_str_split(struct_cluster->V_cluster_radical, ","); xbt_dynar_foreach(radical_elements, iter, groups) { + memset(&host,0,sizeof(host)); + 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 *)); + start=surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, start, struct_cluster->V_cluster_suffix); link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, start); XBT_DEBUG("", host_id, struct_cluster->S_cluster_power); - struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1); - struct_host->V_host_id = host_id; + host.V_host_id = host_id; if(strcmp(struct_cluster->V_cluster_availability_file,"")){ xbt_dict_set(patterns, "radical", bprintf("%d", start), xbt_free); char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file); xbt_str_varsubst(tmp_availability_file,patterns); XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file); - struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file); + host.V_host_power_trace = tmgr_trace_new(tmp_availability_file); xbt_free(tmp_availability_file); } else @@ -1659,7 +1632,7 @@ void routing_parse_Scluster(void) char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file); xbt_str_varsubst(tmp_state_file,patterns); XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file); - struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file); + host.V_host_state_trace = tmgr_trace_new(tmp_state_file); xbt_free(tmp_state_file); } else @@ -1667,12 +1640,12 @@ void routing_parse_Scluster(void) XBT_DEBUG("\tstate_file=\"\""); } - struct_host->V_host_power_peak = struct_cluster->S_cluster_power; - struct_host->V_host_power_scale = 1.0; - struct_host->V_host_core = struct_cluster->S_cluster_core; - struct_host->V_host_state_initial = SURF_RESOURCE_ON; - struct_host->V_host_coord = ""; - surf_parse_host(); + host.V_host_power_peak = struct_cluster->S_cluster_power; + host.V_host_power_scale = 1.0; + host.V_host_core = struct_cluster->S_cluster_core; + host.V_host_state_initial = SURF_RESOURCE_ON; + host.V_host_coord = ""; + sg_platf_new_host(&host); XBT_DEBUG(""); A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; @@ -1713,9 +1686,8 @@ void routing_parse_Scluster(void) case 2: - surf_parse_get_int(&start, - xbt_dynar_get_as(radical_ends, 0, char *)); - surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); + start=surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); + end= surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); for (i = start; i <= end; i++) { host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix); link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i); @@ -1723,14 +1695,13 @@ void routing_parse_Scluster(void) A_surfxml_host_state = A_surfxml_host_state_ON; XBT_DEBUG("", host_id, struct_cluster->S_cluster_power); - struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1); - struct_host->V_host_id = host_id; + host.V_host_id = host_id; if(strcmp(struct_cluster->V_cluster_availability_file,"")){ xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free); char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file); xbt_str_varsubst(tmp_availability_file,patterns); XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file); - struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file); + host.V_host_power_trace = tmgr_trace_new(tmp_availability_file); xbt_free(tmp_availability_file); } else @@ -1741,7 +1712,7 @@ void routing_parse_Scluster(void) char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file); xbt_str_varsubst(tmp_state_file,patterns); XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file); - struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file); + host.V_host_state_trace = tmgr_trace_new(tmp_state_file); xbt_free(tmp_state_file); } else @@ -1749,12 +1720,12 @@ void routing_parse_Scluster(void) XBT_DEBUG("\tstate_file=\"\""); } - struct_host->V_host_power_peak = struct_cluster->S_cluster_power; - struct_host->V_host_power_scale = 1.0; - struct_host->V_host_core = struct_cluster->S_cluster_core; - struct_host->V_host_state_initial = SURF_RESOURCE_ON; - struct_host->V_host_coord = ""; - surf_parse_host(); + host.V_host_power_peak = struct_cluster->S_cluster_power; + host.V_host_power_scale = 1.0; + host.V_host_core = struct_cluster->S_cluster_core; + host.V_host_state_initial = SURF_RESOURCE_ON; + host.V_host_coord = ""; + sg_platf_new_host(&host); XBT_DEBUG(""); A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED; @@ -2030,11 +2001,11 @@ static void routing_parse_Srandom(void) char *random_radical = A_surfxml_random_radical; char *rd_name = NULL; char *rd_value; - surf_parse_get_double(&mean,A_surfxml_random_mean); - surf_parse_get_double(&std,A_surfxml_random_std_deviation); - surf_parse_get_double(&min,A_surfxml_random_min); - surf_parse_get_double(&max,A_surfxml_random_max); - surf_parse_get_double(&seed,A_surfxml_random_seed); + mean = surf_parse_get_double(A_surfxml_random_mean); + std = surf_parse_get_double(A_surfxml_random_std_deviation); + min = surf_parse_get_double(A_surfxml_random_min); + max = surf_parse_get_double(A_surfxml_random_max); + seed = surf_parse_get_double(A_surfxml_random_seed); double res = 0; int i = 0; @@ -2103,9 +2074,9 @@ static void routing_parse_Srandom(void) xbt_free(tmpbuf); break; - case 2: surf_parse_get_int(&start, - xbt_dynar_get_as(radical_ends, 0, char *)); - surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *)); + case 2: + start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *)); + end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *)); for (i = start; i <= end; i++) { xbt_assert(!xbt_dict_get_or_null(random_value,random_id),"Custom Random '%s' already exists !",bprintf("%s%d",random_id,i)); res = random_generate(random);