X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/607e033306049c7d3bdb768dd2b05c279d22e4b8..8353ca761ac086a2dffa56a6b1c862f19b803879:/src/surf/surfxml_parse.c diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index a2afeae851..e6732d8c74 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -11,27 +11,40 @@ #include "surf/surfxml_parse_private.h" #include "surf/surf_private.h" +host_t struct_host; +router_t struct_router; +cluster_t struct_cluster; +peer_t struct_peer; +link_t struct_lnk; + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_parse, surf, "Logging specific to the SURF parsing module"); #undef CLEANUP +int ETag_surfxml_include_state(void); + #include "simgrid_dtd.c" +char *platform_filename; + /* Initialize the parsing globals */ -int route_action = 0; xbt_dict_t traces_set_list = NULL; -//xbt_dynar_t traces_connect_list = NULL; xbt_dict_t trace_connect_list_host_avail = NULL; xbt_dict_t trace_connect_list_power = NULL; xbt_dict_t trace_connect_list_link_avail = NULL; xbt_dict_t trace_connect_list_bandwidth = NULL; xbt_dict_t trace_connect_list_latency = NULL; -/* This buffer is used to store the original buffer before substituing it by out own buffer. Usefull for the foreach tag */ +/* This buffer is used to store the original buffer before substituting it by out own buffer. Useful for the foreach tag */ static xbt_dynar_t surfxml_bufferstack_stack = NULL; int surfxml_bufferstack_size = 2048; + static char *old_buff = NULL; static void surf_parse_error(char *msg); +unsigned int surfxml_buffer_stack_stack_ptr; +unsigned int surfxml_buffer_stack_stack[1024]; + + void surfxml_bufferstack_push(int new) { if (!new) @@ -52,11 +65,6 @@ void surfxml_bufferstack_pop(int new) } } -/* Stores the set name reffered to by the foreach tag */ -static char *foreach_set_name; -static xbt_dynar_t main_STag_surfxml_host_cb_list = NULL; -static xbt_dynar_t main_STag_surfxml_link_cb_list = NULL; - /* make sure these symbols are defined as strong ones in this file so that the linked can resolve them */ xbt_dynar_t STag_surfxml_platform_cb_list = NULL; xbt_dynar_t ETag_surfxml_platform_cb_list = NULL; @@ -68,68 +76,168 @@ xbt_dynar_t STag_surfxml_link_cb_list = NULL; xbt_dynar_t ETag_surfxml_link_cb_list = NULL; xbt_dynar_t STag_surfxml_route_cb_list = NULL; xbt_dynar_t ETag_surfxml_route_cb_list = NULL; -xbt_dynar_t STag_surfxml_link_c_ctn_cb_list = NULL; -xbt_dynar_t ETag_surfxml_link_c_ctn_cb_list = NULL; +xbt_dynar_t STag_surfxml_link_ctn_cb_list = NULL; +xbt_dynar_t ETag_surfxml_link_ctn_cb_list = NULL; xbt_dynar_t STag_surfxml_process_cb_list = NULL; xbt_dynar_t ETag_surfxml_process_cb_list = NULL; xbt_dynar_t STag_surfxml_argument_cb_list = NULL; xbt_dynar_t ETag_surfxml_argument_cb_list = NULL; xbt_dynar_t STag_surfxml_prop_cb_list = NULL; xbt_dynar_t ETag_surfxml_prop_cb_list = NULL; -xbt_dynar_t STag_surfxml_set_cb_list = NULL; -xbt_dynar_t ETag_surfxml_set_cb_list = NULL; -xbt_dynar_t STag_surfxml_foreach_cb_list = NULL; -xbt_dynar_t ETag_surfxml_foreach_cb_list = NULL; -xbt_dynar_t STag_surfxml_route_c_multi_cb_list = NULL; -xbt_dynar_t ETag_surfxml_route_c_multi_cb_list = NULL; xbt_dynar_t STag_surfxml_cluster_cb_list = NULL; xbt_dynar_t ETag_surfxml_cluster_cb_list = NULL; +xbt_dynar_t STag_surfxml_peer_cb_list = NULL; +xbt_dynar_t ETag_surfxml_peer_cb_list = NULL; xbt_dynar_t STag_surfxml_trace_cb_list = NULL; xbt_dynar_t ETag_surfxml_trace_cb_list = NULL; -xbt_dynar_t STag_surfxml_trace_c_connect_cb_list = NULL; -xbt_dynar_t ETag_surfxml_trace_c_connect_cb_list = NULL; +xbt_dynar_t STag_surfxml_trace_connect_cb_list = NULL; +xbt_dynar_t ETag_surfxml_trace_connect_cb_list = NULL; xbt_dynar_t STag_surfxml_random_cb_list = NULL; xbt_dynar_t ETag_surfxml_random_cb_list = NULL; -xbt_dynar_t STag_surfxml_AS_cb_list = NULL; // addded by david -xbt_dynar_t ETag_surfxml_AS_cb_list = NULL; // addded by david -xbt_dynar_t STag_surfxml_gateway_cb_list = NULL; // addded by david -xbt_dynar_t ETag_surfxml_gateway_cb_list = NULL; // addded by david - -/* Stores the sets defined in the XML */ -xbt_dict_t set_list = NULL; - +xbt_dynar_t STag_surfxml_AS_cb_list = NULL; +xbt_dynar_t ETag_surfxml_AS_cb_list = NULL; +xbt_dynar_t STag_surfxml_ASroute_cb_list = NULL; +xbt_dynar_t ETag_surfxml_ASroute_cb_list = NULL; +xbt_dynar_t STag_surfxml_bypassRoute_cb_list = NULL; +xbt_dynar_t ETag_surfxml_bypassRoute_cb_list = NULL; +xbt_dynar_t STag_surfxml_config_cb_list = NULL; +xbt_dynar_t ETag_surfxml_config_cb_list = NULL; +xbt_dynar_t STag_surfxml_include_cb_list = NULL; +xbt_dynar_t ETag_surfxml_include_cb_list = NULL; + +/* store the current property set for any tag */ xbt_dict_t current_property_set = NULL; - -/* For the route:multi tag */ -xbt_dict_t route_table = NULL; -xbt_dict_t route_multi_table = NULL; -xbt_dynar_t route_multi_elements = NULL; -static xbt_dynar_t route_link_list = NULL; -xbt_dynar_t links = NULL; -xbt_dynar_t keys = NULL; - +/* dictionary of random generator data */ xbt_dict_t random_data_list = NULL; -static xbt_dynar_t surf_input_buffer_stack = NULL; -static xbt_dynar_t surf_file_to_parse_stack = NULL; - static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t); YY_BUFFER_STATE surf_input_buffer; FILE *surf_file_to_parse = NULL; -static void convert_route_multi_to_routes(void); -static void parse_route_elem(void); -static void parse_Stag_foreach(void); -static void parse_sets(void); -static void parse_Stag_route_multi(void); -static void parse_Etag_route_multi(void); +static void surf_parse_error(char *msg); + static void parse_Stag_trace(void); static void parse_Etag_trace(void); -static void parse_Stag_trace_c_connect(void); +static void parse_Stag_trace_connect(void); + static void init_randomness(void); static void add_randomness(void); +static xbt_dynar_t surf_input_buffer_stack = NULL; +static xbt_dynar_t surf_file_to_parse_stack = NULL; + +void STag_surfxml_include(void) +{ + XBT_INFO("STag_surfxml_include '%s'",A_surfxml_include_file); + xbt_dynar_push(surf_file_to_parse_stack, &surf_file_to_parse); //save old filename + + surf_file_to_parse = surf_fopen(A_surfxml_include_file, "r"); // read new filename + xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", + A_surfxml_include_file); + xbt_dynar_push(surf_input_buffer_stack,&surf_input_buffer); + surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE); + surf_parse_push_buffer_state(surf_input_buffer); + fflush(NULL); +} + +void ETag_surfxml_include(void) +{ +// XBT_INFO("ETag_surfxml_include '%s'",A_surfxml_include_file); +// fflush(NULL); +// fclose(surf_file_to_parse); +// xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse); // restore old filename +// surf_parse_pop_buffer_state(); +// xbt_dynar_pop(surf_input_buffer_stack,&surf_input_buffer); +} + +/* + * Return 1 if tag include is opened + */ +int ETag_surfxml_include_state(void) +{ + fflush(NULL); + XBT_INFO("ETag_surfxml_include_state '%s'",A_surfxml_include_file); + if(xbt_dynar_length(surf_input_buffer_stack)!= 0) + return 1; + fclose(surf_file_to_parse); + xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse); + surf_parse_pop_buffer_state(); + xbt_dynar_pop(surf_input_buffer_stack,surf_input_buffer); + return 0; +} + + +void surf_parse_init_callbacks(void) +{ + STag_surfxml_platform_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_platform_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_router_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_router_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_route_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_route_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_link_ctn_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_link_ctn_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_process_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_process_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_argument_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_argument_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_trace_connect_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_trace_connect_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_AS_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_AS_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_ASroute_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_ASroute_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_bypassRoute_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_bypassRoute_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_cluster_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_cluster_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_peer_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_peer_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_config_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_config_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + STag_surfxml_include_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); + ETag_surfxml_include_cb_list = + xbt_dynar_new(sizeof(void_f_void_t), NULL); +} + +void surf_parse_reset_callbacks(void) +{ + surf_parse_free_callbacks(); + surf_parse_init_callbacks(); +} + void surf_parse_free_callbacks(void) { xbt_dynar_free(&STag_surfxml_platform_cb_list); @@ -142,104 +250,37 @@ void surf_parse_free_callbacks(void) xbt_dynar_free(&ETag_surfxml_link_cb_list); xbt_dynar_free(&STag_surfxml_route_cb_list); xbt_dynar_free(&ETag_surfxml_route_cb_list); - xbt_dynar_free(&STag_surfxml_link_c_ctn_cb_list); - xbt_dynar_free(&ETag_surfxml_link_c_ctn_cb_list); + xbt_dynar_free(&STag_surfxml_link_ctn_cb_list); + xbt_dynar_free(&ETag_surfxml_link_ctn_cb_list); xbt_dynar_free(&STag_surfxml_process_cb_list); xbt_dynar_free(&ETag_surfxml_process_cb_list); xbt_dynar_free(&STag_surfxml_argument_cb_list); xbt_dynar_free(&ETag_surfxml_argument_cb_list); xbt_dynar_free(&STag_surfxml_prop_cb_list); xbt_dynar_free(&ETag_surfxml_prop_cb_list); - xbt_dynar_free(&STag_surfxml_set_cb_list); - xbt_dynar_free(&ETag_surfxml_set_cb_list); - xbt_dynar_free(&STag_surfxml_foreach_cb_list); - xbt_dynar_free(&ETag_surfxml_foreach_cb_list); - xbt_dynar_free(&STag_surfxml_route_c_multi_cb_list); - xbt_dynar_free(&ETag_surfxml_route_c_multi_cb_list); - xbt_dynar_free(&STag_surfxml_cluster_cb_list); - xbt_dynar_free(&ETag_surfxml_cluster_cb_list); xbt_dynar_free(&STag_surfxml_trace_cb_list); xbt_dynar_free(&ETag_surfxml_trace_cb_list); - xbt_dynar_free(&STag_surfxml_trace_c_connect_cb_list); - xbt_dynar_free(&ETag_surfxml_trace_c_connect_cb_list); + xbt_dynar_free(&STag_surfxml_trace_connect_cb_list); + xbt_dynar_free(&ETag_surfxml_trace_connect_cb_list); xbt_dynar_free(&STag_surfxml_random_cb_list); xbt_dynar_free(&ETag_surfxml_random_cb_list); - xbt_dynar_free(&STag_surfxml_AS_cb_list); // addded by david - xbt_dynar_free(&ETag_surfxml_AS_cb_list); // addded by david - xbt_dynar_free(&STag_surfxml_gateway_cb_list); // addded by david - xbt_dynar_free(&ETag_surfxml_gateway_cb_list); // addded by david -} - -void surf_parse_reset_parser(void) -{ - surf_parse_free_callbacks(); - STag_surfxml_platform_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_platform_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_router_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_router_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_route_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_route_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_link_c_ctn_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_link_c_ctn_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_process_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_process_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_argument_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_argument_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_prop_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_set_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_set_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_foreach_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_foreach_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_route_c_multi_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_route_c_multi_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_cluster_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_cluster_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_trace_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_trace_c_connect_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_trace_c_connect_cb_list = - xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - ETag_surfxml_random_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_AS_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); // addded by david - ETag_surfxml_AS_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); // addded by david - STag_surfxml_gateway_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); // addded by david - ETag_surfxml_gateway_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); // addded by david -} - -void STag_surfxml_include(void) -{ - xbt_dynar_push(surf_input_buffer_stack, &surf_input_buffer); - xbt_dynar_push(surf_file_to_parse_stack, &surf_file_to_parse); - - surf_file_to_parse = surf_fopen(A_surfxml_include_file, "r"); - xbt_assert1((surf_file_to_parse), "Unable to open \"%s\"\n", - A_surfxml_include_file); - surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, 10); - surf_parse__switch_to_buffer(surf_input_buffer); - printf("STAG\n"); - fflush(NULL); + xbt_dynar_free(&STag_surfxml_AS_cb_list); + xbt_dynar_free(&ETag_surfxml_AS_cb_list); + xbt_dynar_free(&STag_surfxml_ASroute_cb_list); + xbt_dynar_free(&ETag_surfxml_ASroute_cb_list); + xbt_dynar_free(&STag_surfxml_bypassRoute_cb_list); + xbt_dynar_free(&ETag_surfxml_bypassRoute_cb_list); + xbt_dynar_free(&STag_surfxml_cluster_cb_list); + xbt_dynar_free(&ETag_surfxml_cluster_cb_list); + xbt_dynar_free(&STag_surfxml_peer_cb_list); + xbt_dynar_free(&ETag_surfxml_peer_cb_list); + xbt_dynar_free(&STag_surfxml_config_cb_list); + xbt_dynar_free(&ETag_surfxml_config_cb_list); + xbt_dynar_free(&STag_surfxml_include_cb_list); + xbt_dynar_free(&ETag_surfxml_include_cb_list); } -void ETag_surfxml_include(void) -{ - printf("ETAG\n"); - fflush(NULL); - surf_parse__delete_buffer(surf_input_buffer); - fclose(surf_file_to_parse); - xbt_dynar_pop(surf_file_to_parse_stack, &surf_file_to_parse); - xbt_dynar_pop(surf_input_buffer_stack, &surf_input_buffer); -} +/* Stag and Etag parse functions */ void STag_surfxml_platform(void) { @@ -247,238 +288,260 @@ void STag_surfxml_platform(void) sscanf(A_surfxml_platform_version, "%lg", &version); - xbt_assert0((version >= 1.0), "******* BIG FAT WARNING *********\n " - "You're using an ancient XML file. " - "Since SimGrid 3.1, units are Bytes, Flops, and seconds " - "instead of MBytes, MFlops and seconds. " - "A script (surfxml_update.pl) to help you convert your old " - "platform files " - "is available in the contrib/platform_generation directory " - "of the simgrid repository. Please check also out the " - "SURF section of the ChangeLog for the 3.1 version. " - "Last, do not forget to also update your values for " - "the calls to MSG_task_create (if any)."); - xbt_assert0((version >= 2.0), "******* BIG FAT WARNING *********\n " - "You're using an old XML file. " - "A script (surfxml_update.pl) to help you convert your old " - "platform files " - "is available in the contrib/platform_generation directory " - "of the simgrid repository."); + xbt_assert((version >= 1.0), "******* BIG FAT WARNING *********\n " + "You're using an ancient XML file.\n" + "Since SimGrid 3.1, units are Bytes, Flops, and seconds " + "instead of MBytes, MFlops and seconds.\n" - surfxml_call_cb_functions(STag_surfxml_platform_cb_list); - -} - -void ETag_surfxml_platform(void) -{ - convert_route_multi_to_routes(); + "Use simgrid_update_xml to update your file automatically. " + "This program is installed automatically with SimGrid, or " + "available in the tools/ directory of the source archive.\n" - surfxml_call_cb_functions(ETag_surfxml_platform_cb_list); + "Please check also out the SURF section of the ChangeLog for " + "the 3.1 version for more information. \n" - xbt_dict_free(&random_data_list); -} + "Last, do not forget to also update your values for " + "the calls to MSG_task_create (if any)."); + xbt_assert((version >= 3.0), "******* BIG FAT WARNING *********\n " + "You're using an old XML file.\n" + "Use simgrid_update_xml to update your file automatically. " + "This program is installed automatically with SimGrid, or " + "available in the tools/ directory of the source archive."); -void STag_surfxml_host(void) -{ - surfxml_call_cb_functions(STag_surfxml_host_cb_list); - -} - -void ETag_surfxml_host(void) -{ - surfxml_call_cb_functions(ETag_surfxml_host_cb_list); -} - -void STag_surfxml_router(void) -{ - surfxml_call_cb_functions(STag_surfxml_router_cb_list); -} - -void ETag_surfxml_router(void) -{ - surfxml_call_cb_functions(ETag_surfxml_router_cb_list); -} - -void STag_surfxml_link(void) -{ - surfxml_call_cb_functions(STag_surfxml_link_cb_list); -} - -void ETag_surfxml_link(void) -{ - surfxml_call_cb_functions(ETag_surfxml_link_cb_list); -} - -void STag_surfxml_route(void) -{ - surfxml_call_cb_functions(STag_surfxml_route_cb_list); -} - -void ETag_surfxml_route(void) -{ - surfxml_call_cb_functions(ETag_surfxml_route_cb_list); -} - -void STag_surfxml_link_c_ctn(void) -{ - surfxml_call_cb_functions(STag_surfxml_link_c_ctn_cb_list); -} - -void ETag_surfxml_link_c_ctn(void) -{ - surfxml_call_cb_functions(ETag_surfxml_link_c_ctn_cb_list); -} - -void STag_surfxml_process(void) -{ - surfxml_call_cb_functions(STag_surfxml_process_cb_list); -} - -void ETag_surfxml_process(void) -{ - surfxml_call_cb_functions(ETag_surfxml_process_cb_list); -} - -void STag_surfxml_argument(void) -{ - surfxml_call_cb_functions(STag_surfxml_argument_cb_list); -} - -void ETag_surfxml_argument(void) -{ - surfxml_call_cb_functions(ETag_surfxml_argument_cb_list); -} - -void STag_surfxml_prop(void) -{ - surfxml_call_cb_functions(STag_surfxml_prop_cb_list); -} - -void ETag_surfxml_prop(void) -{ - surfxml_call_cb_functions(ETag_surfxml_prop_cb_list); -} - -void STag_surfxml_set(void) -{ - surfxml_call_cb_functions(STag_surfxml_set_cb_list); -} - -void ETag_surfxml_set(void) -{ - surfxml_call_cb_functions(ETag_surfxml_set_cb_list); -} - -void STag_surfxml_foreach(void) -{ - /* Save the current buffer */ - surfxml_bufferstack_push(0); - surfxml_call_cb_functions(STag_surfxml_foreach_cb_list); -} - -void ETag_surfxml_foreach(void) -{ - surfxml_call_cb_functions(ETag_surfxml_foreach_cb_list); - - /* free the temporary dynar and restore original */ - xbt_dynar_free(&STag_surfxml_host_cb_list); - STag_surfxml_host_cb_list = main_STag_surfxml_host_cb_list; - - /* free the temporary dynar and restore original */ - xbt_dynar_free(&STag_surfxml_link_cb_list); - STag_surfxml_link_cb_list = main_STag_surfxml_link_cb_list; -} - -void STag_surfxml_route_c_multi(void) -{ - surfxml_call_cb_functions(STag_surfxml_route_c_multi_cb_list); -} - -void ETag_surfxml_route_c_multi(void) -{ - surfxml_call_cb_functions(ETag_surfxml_route_c_multi_cb_list); -} - -void STag_surfxml_cluster(void) -{ - surfxml_call_cb_functions(STag_surfxml_cluster_cb_list); -} - -void ETag_surfxml_cluster(void) -{ - surfxml_call_cb_functions(ETag_surfxml_cluster_cb_list); -} - -void STag_surfxml_trace(void) -{ - surfxml_call_cb_functions(STag_surfxml_trace_cb_list); -} - -void ETag_surfxml_trace(void) -{ - surfxml_call_cb_functions(ETag_surfxml_trace_cb_list); -} - -void STag_surfxml_trace_c_connect(void) -{ - surfxml_call_cb_functions(STag_surfxml_trace_c_connect_cb_list); -} - -void ETag_surfxml_trace_c_connect(void) -{ - surfxml_call_cb_functions(ETag_surfxml_trace_c_connect_cb_list); -} - -void STag_surfxml_random(void) -{ - surfxml_call_cb_functions(STag_surfxml_random_cb_list); -} - -void ETag_surfxml_random(void) -{ - surfxml_call_cb_functions(ETag_surfxml_random_cb_list); -} - -void STag_surfxml_AS(void) // addded by david -{ - surfxml_call_cb_functions(STag_surfxml_AS_cb_list); -} - -void ETag_surfxml_AS(void) // addded by david -{ - surfxml_call_cb_functions(ETag_surfxml_AS_cb_list); -} + surfxml_call_cb_functions(STag_surfxml_platform_cb_list); -void STag_surfxml_gateway(void) // addded by david -{ - surfxml_call_cb_functions(STag_surfxml_gateway_cb_list); } -void ETag_surfxml_gateway(void) // addded by david -{ - surfxml_call_cb_functions(ETag_surfxml_gateway_cb_list); -} +void STag_surfxml_host(void){ +// XBT_INFO("STag_surfxml_host [%s]",A_surfxml_host_id); + struct_host = xbt_new0(s_host_t, 1); + struct_host->V_host_id = xbt_strdup(A_surfxml_host_id); + struct_host->V_host_power_peak = get_cpu_power(A_surfxml_host_power); + surf_parse_get_double(&(struct_host->V_host_power_scale), A_surfxml_host_availability); + surf_parse_get_int(&(struct_host->V_host_core),A_surfxml_host_core); + struct_host->V_host_power_trace = tmgr_trace_new(A_surfxml_host_availability_file); + struct_host->V_host_state_trace = tmgr_trace_new(A_surfxml_host_state_file); + xbt_assert((A_surfxml_host_state == A_surfxml_host_state_ON) || + (A_surfxml_host_state == A_surfxml_host_state_OFF), "Invalid state"); + if (A_surfxml_host_state == A_surfxml_host_state_ON) + struct_host->V_host_state_initial = SURF_RESOURCE_ON; + if (A_surfxml_host_state == A_surfxml_host_state_OFF) + struct_host->V_host_state_initial = SURF_RESOURCE_OFF; + struct_host->V_host_coord = xbt_strdup(A_surfxml_host_coordinates); + + surfxml_call_cb_functions(STag_surfxml_host_cb_list); +} +void ETag_surfxml_host(void){ + surfxml_call_cb_functions(ETag_surfxml_host_cb_list); + //xbt_free(struct_host->V_host_id); + struct_host->V_host_power_peak = 0.0; + struct_host->V_host_core = 0; + struct_host->V_host_power_scale = 0.0; + struct_host->V_host_state_initial = SURF_RESOURCE_ON; + struct_host->V_host_power_trace = NULL; + struct_host->V_host_state_trace = NULL; + xbt_free(struct_host->V_host_coord); + //xbt_free(host); +} + +void STag_surfxml_router(void){ + struct_router = xbt_new0(s_router_t, 1); + struct_router->V_router_id = xbt_strdup(A_surfxml_router_id); + struct_router->V_router_coord = xbt_strdup(A_surfxml_router_coordinates); + surfxml_call_cb_functions(STag_surfxml_router_cb_list); +} +void ETag_surfxml_router(void){ + surfxml_call_cb_functions(ETag_surfxml_router_cb_list); + xbt_free(struct_router->V_router_id); + xbt_free(struct_router->V_router_coord); + xbt_free(struct_router); +} + +void STag_surfxml_cluster(void){ + struct_cluster = xbt_new0(s_cluster_t, 1); + struct_cluster->V_cluster_id = xbt_strdup(A_surfxml_cluster_id); + struct_cluster->V_cluster_prefix = xbt_strdup(A_surfxml_cluster_prefix); + struct_cluster->V_cluster_suffix = xbt_strdup(A_surfxml_cluster_suffix); + struct_cluster->V_cluster_radical = xbt_strdup(A_surfxml_cluster_radical); + struct_cluster->S_cluster_power = xbt_strdup(A_surfxml_cluster_power); + struct_cluster->S_cluster_core = xbt_strdup(A_surfxml_cluster_core); + struct_cluster->S_cluster_bw = xbt_strdup(A_surfxml_cluster_bw); + struct_cluster->S_cluster_lat = xbt_strdup(A_surfxml_cluster_lat); + struct_cluster->S_cluster_bb_bw = xbt_strdup(A_surfxml_cluster_bb_bw); + struct_cluster->S_cluster_bb_lat = xbt_strdup(A_surfxml_cluster_bb_lat); + if(!strcmp(A_surfxml_cluster_router_id,"")) + struct_cluster->S_cluster_router_id = bprintf("%s%s_router%s", + struct_cluster->V_cluster_prefix, + struct_cluster->V_cluster_id, + struct_cluster->V_cluster_suffix); + else + struct_cluster->S_cluster_router_id = xbt_strdup(A_surfxml_cluster_router_id); + + struct_cluster->V_cluster_sharing_policy = AX_surfxml_cluster_sharing_policy; + struct_cluster->V_cluster_bb_sharing_policy = AX_surfxml_cluster_bb_sharing_policy; + + surfxml_call_cb_functions(STag_surfxml_cluster_cb_list); +} +void ETag_surfxml_cluster(void){ + surfxml_call_cb_functions(ETag_surfxml_cluster_cb_list); + xbt_free(struct_cluster->V_cluster_id); + xbt_free(struct_cluster->V_cluster_prefix); + xbt_free(struct_cluster->V_cluster_suffix); + xbt_free(struct_cluster->V_cluster_radical); + xbt_free(struct_cluster->S_cluster_power); + xbt_free(struct_cluster->S_cluster_core); + xbt_free(struct_cluster->S_cluster_bw); + xbt_free(struct_cluster->S_cluster_lat); + xbt_free(struct_cluster->S_cluster_bb_bw); + xbt_free(struct_cluster->S_cluster_bb_lat); + xbt_free(struct_cluster->S_cluster_router_id); + struct_cluster->V_cluster_sharing_policy = 0; + struct_cluster->V_cluster_bb_sharing_policy = 0; + xbt_free(struct_cluster); +} + +void STag_surfxml_peer(void){ + struct_peer = xbt_new0(s_peer_t, 1); + struct_peer->V_peer_id = xbt_strdup(A_surfxml_peer_id); + struct_peer->V_peer_power = xbt_strdup(A_surfxml_peer_power); + struct_peer->V_peer_bw_in = xbt_strdup(A_surfxml_peer_bw_in); + struct_peer->V_peer_bw_out = xbt_strdup(A_surfxml_peer_bw_out); + struct_peer->V_peer_lat = xbt_strdup(A_surfxml_peer_lat); + struct_peer->V_peer_coord = xbt_strdup(A_surfxml_peer_coordinates); + struct_peer->V_peer_availability_trace = xbt_strdup(A_surfxml_peer_availability_file); + struct_peer->V_peer_state_trace = xbt_strdup(A_surfxml_peer_state_file); + surfxml_call_cb_functions(STag_surfxml_peer_cb_list); +} +void ETag_surfxml_peer(void){ + surfxml_call_cb_functions(ETag_surfxml_peer_cb_list); + xbt_free(struct_peer->V_peer_id); + xbt_free(struct_peer->V_peer_power); + xbt_free(struct_peer->V_peer_bw_in); + xbt_free(struct_peer->V_peer_bw_out); + xbt_free(struct_peer->V_peer_lat); + xbt_free(struct_peer->V_peer_coord); + xbt_free(struct_peer->V_peer_availability_trace); + xbt_free(struct_peer->V_peer_state_trace); + xbt_free(struct_peer); +} +void STag_surfxml_link(void){ + struct_lnk = xbt_new0(s_link_t, 1); + struct_lnk->V_link_id = xbt_strdup(A_surfxml_link_id); + surf_parse_get_double(&(struct_lnk->V_link_bandwidth),A_surfxml_link_bandwidth); + struct_lnk->V_link_bandwidth_file = tmgr_trace_new(A_surfxml_link_bandwidth_file); + surf_parse_get_double(&(struct_lnk->V_link_latency),A_surfxml_link_latency); + struct_lnk->V_link_latency_file = tmgr_trace_new(A_surfxml_link_latency_file); + xbt_assert((A_surfxml_link_state == A_surfxml_link_state_ON) || + (A_surfxml_link_state == A_surfxml_link_state_OFF), "Invalid state"); + if (A_surfxml_link_state == A_surfxml_link_state_ON) + struct_lnk->V_link_state = SURF_RESOURCE_ON; + if (A_surfxml_link_state == A_surfxml_link_state_OFF) + struct_lnk->V_link_state = SURF_RESOURCE_OFF; + struct_lnk->V_link_state_file = tmgr_trace_new(A_surfxml_link_state_file); + struct_lnk->V_link_sharing_policy = A_surfxml_link_sharing_policy; + + if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_SHARED) + struct_lnk->V_policy_initial_link = SURF_LINK_SHARED; + else + { + if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FATPIPE) + struct_lnk->V_policy_initial_link = SURF_LINK_FATPIPE; + else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX) + struct_lnk->V_policy_initial_link = SURF_LINK_FULLDUPLEX; + } + + + surfxml_call_cb_functions(STag_surfxml_link_cb_list); +} +void ETag_surfxml_link(void){ + surfxml_call_cb_functions(ETag_surfxml_link_cb_list); + xbt_free(struct_lnk->V_link_id); + struct_lnk->V_link_bandwidth = 0; + struct_lnk->V_link_bandwidth_file = NULL; + struct_lnk->V_link_latency = 0; + struct_lnk->V_link_latency_file = NULL; + struct_lnk->V_link_state = SURF_RESOURCE_ON; + struct_lnk->V_link_state_file = NULL; + struct_lnk->V_link_sharing_policy = 0; + xbt_free(struct_lnk); +} + +void STag_surfxml_route(void){ + surfxml_call_cb_functions(STag_surfxml_route_cb_list); +} +void STag_surfxml_link_ctn(void){ + surfxml_call_cb_functions(STag_surfxml_link_ctn_cb_list); +} +void STag_surfxml_process(void){ + surfxml_call_cb_functions(STag_surfxml_process_cb_list); +} +void STag_surfxml_argument(void){ + surfxml_call_cb_functions(STag_surfxml_argument_cb_list); +} +void STag_surfxml_prop(void){ + surfxml_call_cb_functions(STag_surfxml_prop_cb_list); +} +void STag_surfxml_trace(void){ + surfxml_call_cb_functions(STag_surfxml_trace_cb_list); +} +void STag_surfxml_trace_connect(void){ + surfxml_call_cb_functions(STag_surfxml_trace_connect_cb_list); +} +void STag_surfxml_AS(void){ + surfxml_call_cb_functions(STag_surfxml_AS_cb_list); +} +void STag_surfxml_ASroute(void){ + surfxml_call_cb_functions(STag_surfxml_ASroute_cb_list); +} +void STag_surfxml_bypassRoute(void){ + surfxml_call_cb_functions(STag_surfxml_bypassRoute_cb_list); +} +void STag_surfxml_config(void){ + surfxml_call_cb_functions(STag_surfxml_config_cb_list); +} +void STag_surfxml_random(void){ + surfxml_call_cb_functions(STag_surfxml_random_cb_list); +} + +#define parse_method(type,name) \ +void type##Tag_surfxml_##name(void) \ +{ surfxml_call_cb_functions(type##Tag_surfxml_##name##_cb_list); } +parse_method(E, platform); +parse_method(E, route); +parse_method(E, link_ctn); +parse_method(E, process); +parse_method(E, argument); +parse_method(E, prop); +parse_method(E, trace); +parse_method(E, trace_connect); +parse_method(E, random); +parse_method(E, AS); +parse_method(E, ASroute); +parse_method(E, bypassRoute); +parse_method(E, config); + +/* Open and Close parse file */ void surf_parse_open(const char *file) { static int warned = 0; /* warn only once */ if (!file) { if (!warned) { - WARN0 - ("Bypassing the XML parser since surf_parse_open received a NULL pointer. If it is not what you want, go fix your code."); + XBT_WARN + ("Bypassing the XML parser since surf_parse_open received a NULL pointer. If it is not what you want, go fix your code."); warned = 1; } return; } - surf_file_to_parse = surf_fopen(file, "r"); - xbt_assert1((surf_file_to_parse), "Unable to open \"%s\"\n", file); if (!surf_input_buffer_stack) - surf_input_buffer_stack = xbt_dynar_new(sizeof(YY_BUFFER_STATE), NULL); + surf_input_buffer_stack = xbt_dynar_new(sizeof(YY_BUFFER_STATE), NULL); if (!surf_file_to_parse_stack) - surf_file_to_parse_stack = xbt_dynar_new(sizeof(FILE *), NULL); + surf_file_to_parse_stack = xbt_dynar_new(sizeof(FILE *), NULL); - surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, 10); + surf_file_to_parse = surf_fopen(file, "r"); + xbt_assert((surf_file_to_parse), "Unable to open \"%s\"\n", file); + surf_input_buffer = surf_parse__create_buffer(surf_file_to_parse, YY_BUF_SIZE); surf_parse__switch_to_buffer(surf_input_buffer); surf_parse_lineno = 1; } @@ -486,16 +549,19 @@ void surf_parse_open(const char *file) void surf_parse_close(void) { if (surf_input_buffer_stack) - xbt_dynar_free(&surf_input_buffer_stack); + xbt_dynar_free(&surf_input_buffer_stack); if (surf_file_to_parse_stack) - xbt_dynar_free(&surf_file_to_parse_stack); + xbt_dynar_free(&surf_file_to_parse_stack); if (surf_file_to_parse) { surf_parse__delete_buffer(surf_input_buffer); fclose(surf_file_to_parse); + surf_file_to_parse = NULL; //Must be reset for Bypass } } +/* Parse Function */ + static int _surf_parse(void) { return surf_parse_lex(); @@ -509,11 +575,9 @@ void surf_parse_error(char *msg) abort(); } - void surf_parse_get_double(double *value, const char *string) { int ret = 0; - ret = sscanf(string, "%lg", value); if (ret != 1) surf_parse_error(bprintf("%s is not a double", string)); @@ -522,39 +586,36 @@ void surf_parse_get_double(double *value, const char *string) void surf_parse_get_int(int *value, const char *string) { int ret = 0; - ret = sscanf(string, "%d", value); if (ret != 1) surf_parse_error(bprintf("%s is not an integer", string)); } -void parse_properties(void) -{ - char *value = NULL; - - if (!current_property_set) - current_property_set = xbt_dict_new(); - - value = xbt_strdup(A_surfxml_prop_value); - xbt_dict_set(current_property_set, A_surfxml_prop_id, value, free); -} +/* Aux parse functions */ void surfxml_add_callback(xbt_dynar_t cb_list, void_f_void_t function) { xbt_dynar_push(cb_list, &function); } -void surfxml_del_callback(xbt_dynar_t* p_cb_list, void_f_void_t function) +void surfxml_del_callback(xbt_dynar_t cb_list, void_f_void_t function) { - xbt_dynar_t new_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - unsigned int it; - void_f_void_t func; - xbt_dynar_foreach(*p_cb_list,it,func) { - if( func != function ) - xbt_dynar_push(new_cb_list, &func); + xbt_ex_t e; + unsigned int it=0; + void_f_void_t null_f=NULL; + + TRY { + it = xbt_dynar_search(cb_list,&function); } - xbt_dynar_free(p_cb_list); - *p_cb_list = new_cb_list; + CATCH(e) { + if (e.category == not_found_error) { + xbt_ex_free(e); + xbt_die("Trying to remove a callback that is not here! This should not happen"); + } + RETHROW; + } + + xbt_dynar_replace(cb_list, it,&null_f); } static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t cb_list) @@ -562,547 +623,107 @@ static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t cb_list) unsigned int iterator; void_f_void_t fun; xbt_dynar_foreach(cb_list, iterator, fun) { - (*fun) (); + if (fun) (*fun) (); } } -static void parse_route_set_endpoints(void) -{ - route_link_list = xbt_dynar_new(sizeof(char *), NULL); -} +/* Init and free parse data */ static void init_data(void) { - xbt_dict_free(&route_table); - xbt_dynar_free(&route_link_list); - route_table = xbt_dict_new(); - if (!surfxml_bufferstack_stack) surfxml_bufferstack_stack = xbt_dynar_new(sizeof(char *), NULL); - route_multi_table = xbt_dict_new(); - route_multi_elements = xbt_dynar_new(sizeof(char *), NULL); - traces_set_list = xbt_dict_new(); - if (set_list == NULL) - set_list = xbt_dict_new(); + traces_set_list = xbt_dict_new(); trace_connect_list_host_avail = xbt_dict_new(); trace_connect_list_power = xbt_dict_new(); trace_connect_list_link_avail = xbt_dict_new(); trace_connect_list_bandwidth = xbt_dict_new(); trace_connect_list_latency = xbt_dict_new(); - random_data_list = xbt_dict_new(); - surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); - surfxml_add_callback(ETag_surfxml_link_c_ctn_cb_list, &parse_route_elem); - surfxml_add_callback(STag_surfxml_route_cb_list, - &parse_route_set_endpoints); - surfxml_add_callback(STag_surfxml_set_cb_list, &parse_sets); - surfxml_add_callback(STag_surfxml_route_c_multi_cb_list, - &parse_Stag_route_multi); - surfxml_add_callback(ETag_surfxml_route_c_multi_cb_list, - &parse_Etag_route_multi); - surfxml_add_callback(STag_surfxml_foreach_cb_list, &parse_Stag_foreach); surfxml_add_callback(STag_surfxml_trace_cb_list, &parse_Stag_trace); surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_Etag_trace); - surfxml_add_callback(STag_surfxml_trace_c_connect_cb_list, - &parse_Stag_trace_c_connect); - surfxml_add_callback(STag_surfxml_random_cb_list, &init_randomness); - surfxml_add_callback(ETag_surfxml_random_cb_list, &add_randomness); + surfxml_add_callback(STag_surfxml_trace_connect_cb_list, + &parse_Stag_trace_connect); } static void free_data(void) { - char *key, *data; - xbt_dict_cursor_t cursor = NULL; - char *name; - unsigned int cpt = 0; - - xbt_dict_foreach(route_table, cursor, key, data) { - xbt_dynar_t links = (xbt_dynar_t) data; - char *name; - unsigned int cpt = 0; - - xbt_dynar_foreach(links, cpt, name) free(name); - xbt_dynar_free(&links); - } - xbt_dict_free(&route_table); - route_link_list = NULL; - - xbt_dict_free(&route_multi_table); - - xbt_dynar_foreach(route_multi_elements, cpt, name) free(name); - xbt_dynar_free(&route_multi_elements); - - xbt_dict_foreach(set_list, cursor, key, data) { - xbt_dynar_t set = (xbt_dynar_t) data; - - xbt_dynar_foreach(set, cpt, name) free(name); - xbt_dynar_free(&set); - } - xbt_dict_free(&set_list); - - xbt_dynar_free(&surfxml_bufferstack_stack); - - xbt_dict_free(&traces_set_list); xbt_dict_free(&trace_connect_list_host_avail); xbt_dict_free(&trace_connect_list_power); xbt_dict_free(&trace_connect_list_link_avail); xbt_dict_free(&trace_connect_list_bandwidth); xbt_dict_free(&trace_connect_list_latency); xbt_dict_free(&traces_set_list); + xbt_dict_free(&random_data_list); + xbt_dynar_free(&surfxml_bufferstack_stack); } +/* Here start parse */ void parse_platform_file(const char *file) { int parse_status; + + surfxml_buffer_stack_stack_ptr = 1; + surfxml_buffer_stack_stack[0] = 0; + surf_parse_open(file); init_data(); parse_status = surf_parse(); free_data(); surf_parse_close(); - if (parse_status) - xbt_dict_free(&random_data_list); - xbt_assert1(!parse_status, "Parse error in %s", file); -} - -/* Functions to bypass route tag. Used by the route:multi tag */ - -static void parse_make_temporary_route(const char *src, const char *dst, - int action) -{ - int AX_ptr = 0; - - A_surfxml_route_action = action; - SURFXML_BUFFER_SET(route_src, src); - SURFXML_BUFFER_SET(route_dst, dst); -} - -/* Functions for the sets and foreach tags */ - -static void parse_sets(void) -{ - char *id, *suffix, *prefix, *radical; - int start, end; - xbt_dynar_t radical_elements; - xbt_dynar_t radical_ends; - xbt_dynar_t current_set; - char *value, *groups; - int i; - unsigned int iter; - - id = xbt_strdup(A_surfxml_set_id); - prefix = xbt_strdup(A_surfxml_set_prefix); - suffix = xbt_strdup(A_surfxml_set_suffix); - radical = xbt_strdup(A_surfxml_set_radical); - - if (xbt_dict_get_or_null(set_list, id)) - surf_parse_error(bprintf - ("Set '%s' declared several times in the platform file.", - id)); - - current_set = xbt_dynar_new(sizeof(char *), NULL); - - radical_elements = xbt_str_split(radical, ","); - xbt_dynar_foreach(radical_elements, iter, groups) { - - 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 *)); - value = bprintf("%s%d%s", prefix, start, suffix); - xbt_dynar_push(current_set, &value); - 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 *)); - - - for (i = start; i <= end; i++) { - value = bprintf("%s%d%s", prefix, i, suffix); - xbt_dynar_push(current_set, &value); - } - break; - - default: - surf_parse_error(xbt_strdup("Malformed radical")); - } - - xbt_dynar_free(&radical_ends); - } - - xbt_dict_set(set_list, id, current_set, NULL); - - xbt_dynar_free(&radical_elements); - free(radical); - free(suffix); - free(prefix); - free(id); -} - -static void parse_host_foreach(void){ - - xbt_dynar_t names = NULL; - unsigned int cpt = 0; - char *name; - xbt_dict_cursor_t cursor = NULL; - char *key, *data; - - const char *surfxml_host_power = A_surfxml_host_power; - const char *surfxml_host_availability = A_surfxml_host_availability; - const char *surfxml_host_availability_file = A_surfxml_host_availability_file; - const char *surfxml_host_state_file = A_surfxml_host_state_file; - - xbt_dict_t cluster_host_props = current_property_set; - - names = xbt_dict_get_or_null(set_list, foreach_set_name); - if (!names) - surf_parse_error(bprintf("Set name '%s' used in not found.", - foreach_set_name)); - if (strcmp(A_surfxml_host_id, "$1")) - surf_parse_error(bprintf - ("The host id within should point to the foreach set_id (use $1 instead of %s)", - A_surfxml_host_id)); - - - /* foreach name in set call the main host callback */ - xbt_dynar_foreach(names, cpt, name) { - int AX_ptr = 0; /* needed by the SURFXML_BUFFER_SET macro */ - - surfxml_bufferstack_push(1); - - SURFXML_BUFFER_SET(host_id, name); - SURFXML_BUFFER_SET(host_power, surfxml_host_power /*hostPower */ ); - SURFXML_BUFFER_SET(host_availability, surfxml_host_availability); - SURFXML_BUFFER_SET(host_availability_file, surfxml_host_availability_file); - SURFXML_BUFFER_SET(host_state_file, surfxml_host_state_file); - - surfxml_call_cb_functions(main_STag_surfxml_host_cb_list); - - xbt_dict_foreach(cluster_host_props, cursor, key, data) { - xbt_dict_set(current_property_set, xbt_strdup(key), xbt_strdup(data), - free); - } - - /* Call the (unmodified) callbacks of , if any */ - surfxml_call_cb_functions(ETag_surfxml_host_cb_list); - surfxml_bufferstack_pop(1); - } - - current_property_set = xbt_dict_new(); - - surfxml_bufferstack_pop(0); + xbt_assert(!parse_status, "Parse error in %s", file); } -static void parse_link_foreach(void) { - const char *surfxml_link_bandwidth = A_surfxml_link_bandwidth; - const char *surfxml_link_bandwidth_file = A_surfxml_link_bandwidth_file; - const char *surfxml_link_latency = A_surfxml_link_latency; - const char *surfxml_link_latency_file = A_surfxml_link_latency_file; - const char *surfxml_link_state_file = A_surfxml_link_state_file; - - xbt_dynar_t names = NULL; - unsigned int cpt = 0; - char *name; - xbt_dict_cursor_t cursor = NULL; - char *key, *data; - - xbt_dict_t cluster_link_props = current_property_set; - - names = xbt_dict_get_or_null(set_list, foreach_set_name); - if (!names) - surf_parse_error(bprintf("Set name '%s' used in not found.", - foreach_set_name)); - if (strcmp(A_surfxml_link_id, "$1")) - surf_parse_error(bprintf - ("The host id within should point to the foreach set_id (use $1 instead of %s)", - A_surfxml_link_id)); - - /* for each name in set call the main link callback */ - xbt_dynar_foreach(names, cpt, name) { - int AX_ptr = 0; /* needed by the SURFXML_BUFFER_SET */ - - surfxml_bufferstack_push(1); - - SURFXML_BUFFER_SET(link_id, name); - SURFXML_BUFFER_SET(link_bandwidth, surfxml_link_bandwidth); - SURFXML_BUFFER_SET(link_bandwidth_file, surfxml_link_bandwidth_file); - SURFXML_BUFFER_SET(link_latency, surfxml_link_latency); - SURFXML_BUFFER_SET(link_latency_file, surfxml_link_latency_file); - SURFXML_BUFFER_SET(link_state_file, surfxml_link_state_file); - - surfxml_call_cb_functions(main_STag_surfxml_link_cb_list); - - xbt_dict_foreach(cluster_link_props, cursor, key, data) { - xbt_dict_set(current_property_set, xbt_strdup(key), xbt_strdup(data), - free); - } - - /* Call the (unmodified) callbacks of , if any */ - surfxml_call_cb_functions(ETag_surfxml_link_cb_list); - surfxml_bufferstack_pop(1); - } - - current_property_set = xbt_dict_new(); - - surfxml_bufferstack_pop(0); - free(foreach_set_name); - foreach_set_name = NULL; -} - -static void parse_Stag_foreach(void) -{ - /* save the host & link callbacks */ - main_STag_surfxml_host_cb_list = STag_surfxml_host_cb_list; - main_STag_surfxml_link_cb_list = STag_surfxml_link_cb_list; - - /* redefine host & link callbacks to be used only by the foreach tag */ - STag_surfxml_host_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - STag_surfxml_link_cb_list = xbt_dynar_new(sizeof(void_f_void_t), NULL); - - surfxml_add_callback(STag_surfxml_host_cb_list, &parse_host_foreach); - surfxml_add_callback(STag_surfxml_link_cb_list, &parse_link_foreach); +/* Prop tag functions */ - /* get set name */ - foreach_set_name = xbt_strdup(A_surfxml_foreach_set_id); -} - -/* Route:multi functions */ - -static int route_multi_size = 0; -static char *src_name, *dst_name; -static int is_symmetric_route; - -static void parse_route_elem(void) +void parse_properties(const char* prop_id, const char* prop_value) { - char *val; - - val = xbt_strdup(A_surfxml_link_c_ctn_id); - - xbt_dynar_push(route_link_list, &val); - //INFO2("Push %s (size now:%ld)",val,xbt_dynar_length(route_link_list)); + char *value = NULL; + if (!current_property_set) + current_property_set = xbt_dict_new(); // Maybe, it should be make a error + if(!strcmp(prop_id,"coordinates")){ + if(!strcmp(prop_value,"yes") && !COORD_HOST_LEVEL) + { + XBT_INFO("Configuration change: Set '%s' to '%s'", prop_id, prop_value); + COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); + COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); + } + if(strcmp(A_surfxml_prop_value,"yes")) + xbt_die("Setting XML prop coordinates must be \"yes\""); + } + else{ + value = xbt_strdup(prop_value); + xbt_dict_set(current_property_set, prop_id, value, free); + } } -static void parse_Stag_route_multi(void) +/** + * With XML parser + */ +void parse_properties_XML(void) { - src_name = xbt_strdup(A_surfxml_route_c_multi_src); - dst_name = xbt_strdup(A_surfxml_route_c_multi_dst); - route_action = A_surfxml_route_c_multi_action; - is_symmetric_route = A_surfxml_route_c_multi_symmetric; - route_multi_size++; - - route_link_list = xbt_dynar_new(sizeof(char *), &xbt_free_ref); + parse_properties(A_surfxml_prop_id, A_surfxml_prop_value); } /* - This function is used to append or override the contents of an already existing route in the case a new one with its name is found. - The decision is based upon the value of action specified in the xml route:multi attribute action + * With lua console */ -void manage_route(xbt_dict_t routing_table, const char *route_name, - int action, int isMultiRoute) -{ - unsigned int cpt; - xbt_dynar_t links; - char *value; - - /* get already existing list if it exists */ - links = xbt_dict_get_or_null(routing_table, route_name); - DEBUG3("ROUTE: %s (action:%s; len:%ld)", route_name, - (action==A_surfxml_route_action_OVERRIDE?"override":( - action==A_surfxml_route_action_PREPEND?"prepend":"postpend")), - (links?xbt_dynar_length(links):0)); - - if (links != NULL) { - switch (action) { - case A_surfxml_route_action_PREPEND: /* add existing links at the end; route_link_list + links */ - xbt_dynar_foreach(links, cpt, value) { - xbt_dynar_push(route_link_list, &value); - } - xbt_dynar_free(&links); - break; - case A_surfxml_route_action_POSTPEND: /* add existing links in front; links + route_link_list */ - xbt_dynar_foreach(route_link_list, cpt, value) { - xbt_dynar_push(links, &value); - } - xbt_dynar_free(&route_link_list); - route_link_list = links; - break; - case A_surfxml_route_action_OVERRIDE: - xbt_dynar_free(&links); - break; - default: - xbt_die(bprintf("While dealing with routes of %s, got action=%d. Please report this bug.", - route_name,action)); - break; - } - - } - /* this is the final route; do not add if name is a set; add only if name is in set list */ - if (!isMultiRoute) { - xbt_dict_set(routing_table, route_name, route_link_list, NULL); - } -} - -static void parse_Etag_route_multi(void) -{ - char *route_name; - - route_name = - bprintf("%s#%s#%d#%d#%d", src_name, dst_name, route_action, - is_symmetric_route, route_multi_size); - - xbt_dynar_push(route_multi_elements, &route_name); - - /* Add route */ - xbt_dict_set(route_multi_table, route_name, route_link_list, NULL); - /* add symmetric if it is the case */ - if (is_symmetric_route == 1) { - char *symmetric_name = - bprintf("%s#%s#%d#%d#%d", dst_name, src_name, route_action, - !is_symmetric_route, route_multi_size); - - xbt_dict_set(route_multi_table, symmetric_name, route_link_list, NULL); - xbt_dynar_push(route_multi_elements, &symmetric_name); - is_symmetric_route = 0; - } - free(src_name); - free(dst_name); -} - -static void add_multi_links(const char *src, const char *dst, - xbt_dynar_t links, const char *src_name, - const char *dst_name) -{ - unsigned int cpt; - char *value, *val; - - surfxml_bufferstack_push(1); - - parse_make_temporary_route(src_name, dst_name, route_action); - surfxml_call_cb_functions(STag_surfxml_route_cb_list); - DEBUG2("\tADDING ROUTE: %s -> %s", src_name, dst_name); - /* Build link list */ - xbt_dynar_foreach(links, cpt, value) { - if (strcmp(value, src) == 0) - val = xbt_strdup(src_name); - else if (strcmp(value, dst) == 0) - val = xbt_strdup(dst_name); - else if (strcmp(value, "$dst") == 0) - val = xbt_strdup(dst_name); - else if (strcmp(value, "$src") == 0) - val = xbt_strdup(src_name); - else - val = xbt_strdup(value); - DEBUG1("\t\tELEMENT: %s", val); - xbt_dynar_push(route_link_list, &val); - } - surfxml_call_cb_functions(ETag_surfxml_route_cb_list); - surfxml_bufferstack_pop(1); -} - -static void convert_route_multi_to_routes(void) +void parse_properties_lua(const char* prop_id, const char* prop_value) { - xbt_dict_cursor_t cursor_w; - int symmetric; - unsigned int cpt, cpt2, cursor; - char *src_host_name, *dst_host_name, *key, *src, *dst, *val, *key_w, - *data_w; - const char *sep = "#"; - xbt_dict_t set = NULL; - xbt_dynar_t src_names = NULL, dst_names = NULL, links; - - if (!route_multi_elements) - return; - - if (surf_cpu_model) - set = surf_model_resource_set(surf_cpu_model); - if (surf_workstation_model != NULL && - surf_model_resource_set(surf_workstation_model) != NULL && - xbt_dict_length(surf_model_resource_set(surf_workstation_model)) > 0) - set = surf_model_resource_set(surf_workstation_model); - - - surfxml_bufferstack_push(0); - /* Get all routes in the exact order they were entered in the platform file */ - xbt_dynar_foreach(route_multi_elements, cursor, key) { - /* Get links for the route */ - links = (xbt_dynar_t) xbt_dict_get_or_null(route_multi_table, key); - keys = xbt_str_split_str(key, sep); - /* Get route ends */ - src = xbt_dynar_get_as(keys, 0, char *); - dst = xbt_dynar_get_as(keys, 1, char *); - route_action = atoi(xbt_dynar_get_as(keys, 2, char *)); - symmetric = atoi(xbt_dynar_get_as(keys, 3, char *)); - - /* Create the dynar of src and dst hosts for the new routes */ - /* NOTE: src and dst can be either set names or simple host names */ - src_names = (xbt_dynar_t) xbt_dict_get_or_null(set_list, src); - dst_names = (xbt_dynar_t) xbt_dict_get_or_null(set_list, dst); - /* Add to dynar even if they are simple names */ - if (src_names == NULL) { - src_names = xbt_dynar_new(sizeof(char *), &xbt_free_ref); - val = xbt_strdup(src); - xbt_dynar_push(src_names, &val); - if (strcmp(val, "$*") != 0 && NULL == xbt_dict_get_or_null(set, val)) - THROW3(unknown_error, 0, - "(In route:multi (%s -> %s) source %s does not exist (not a set or a host)", - src, dst, src); - } - if (dst_names == NULL) { - dst_names = xbt_dynar_new(sizeof(char *), &xbt_free_ref); - val = xbt_strdup(dst); - if (strcmp(val, "$*") != 0 && NULL == xbt_dict_get_or_null(set, val)) - THROW3(unknown_error, 0, - "(In route:multi (%s -> %s) destination %s does not exist (not a set or a host)", - src, dst, dst); - xbt_dynar_push(dst_names, &val); - } - - /* Build the routes */ - DEBUG2("ADDING MULTI ROUTE: %s -> %s", xbt_dynar_get_as(keys, 0, char *), - xbt_dynar_get_as(keys, 1, char *)); - xbt_dynar_foreach(src_names, cpt, src_host_name) { - xbt_dynar_foreach(dst_names, cpt2, dst_host_name) { - /* If dst is $* then set this route to have its dst point to all hosts */ - if (strcmp(src_host_name, "$*") != 0 - && strcmp(dst_host_name, "$*") == 0) { - xbt_dict_foreach(set, cursor_w, key_w, data_w) { - //int n = xbt_dynar_member(src_names, (char*)key_w); - add_multi_links(src, dst, links, src_host_name, key_w); - } - } - /* If src is $* then set this route to have its dst point to all hosts */ - if (strcmp(src_host_name, "$*") == 0 - && strcmp(dst_host_name, "$*") != 0) { - xbt_dict_foreach(set, cursor_w, key_w, data_w) { - // if (!symmetric || (symmetric && !contains(dst_names, key_w))) - add_multi_links(src, dst, links, key_w, dst_host_name); - } - } - /* if none of them are equal to $* */ - if (strcmp(src_host_name, "$*") != 0 - && strcmp(dst_host_name, "$*") != 0) { - add_multi_links(src, dst, links, src_host_name, dst_host_name); - } - } - } - xbt_dynar_free(&keys); - } - surfxml_bufferstack_pop(0); + parse_properties(prop_id, prop_value); } - /* Trace management functions */ static double trace_periodicity = -1.0; static char *trace_file = NULL; -static char *trace_id; +static char *trace_id = NULL; static void parse_Stag_trace(void) { - trace_id = strdup(A_surfxml_trace_id); - trace_file = strdup(A_surfxml_trace_file); + trace_id = xbt_strdup(A_surfxml_trace_id); + trace_file = xbt_strdup(A_surfxml_trace_file); surf_parse_get_double(&trace_periodicity, A_surfxml_trace_periodicity); } @@ -1116,48 +737,52 @@ static void parse_Etag_trace(void) trace = NULL; else trace = - tmgr_trace_new_from_string(trace_id, surfxml_pcdata, - trace_periodicity); + tmgr_trace_new_from_string(trace_id, surfxml_pcdata, + trace_periodicity); } xbt_dict_set(traces_set_list, trace_id, (void *) trace, NULL); + xbt_free(trace_file); + trace_file = NULL; + xbt_free(trace_id); + trace_id = NULL; } -static void parse_Stag_trace_c_connect(void) +static void parse_Stag_trace_connect(void) { - xbt_assert2(xbt_dict_get_or_null - (traces_set_list, A_surfxml_trace_c_connect_trace), + xbt_assert(xbt_dict_get_or_null + (traces_set_list, A_surfxml_trace_connect_trace), "Cannot connect trace %s to %s: trace unknown", - A_surfxml_trace_c_connect_trace, - A_surfxml_trace_c_connect_element); + A_surfxml_trace_connect_trace, + A_surfxml_trace_connect_element); - switch (A_surfxml_trace_c_connect_kind) { - case A_surfxml_trace_c_connect_kind_HOST_AVAIL: + switch (A_surfxml_trace_connect_kind) { + case A_surfxml_trace_connect_kind_HOST_AVAIL: xbt_dict_set(trace_connect_list_host_avail, - A_surfxml_trace_c_connect_trace, - xbt_strdup(A_surfxml_trace_c_connect_element), free); + A_surfxml_trace_connect_trace, + xbt_strdup(A_surfxml_trace_connect_element), free); break; - case A_surfxml_trace_c_connect_kind_POWER: - xbt_dict_set(trace_connect_list_power, A_surfxml_trace_c_connect_trace, - xbt_strdup(A_surfxml_trace_c_connect_element), free); + case A_surfxml_trace_connect_kind_POWER: + xbt_dict_set(trace_connect_list_power, A_surfxml_trace_connect_trace, + xbt_strdup(A_surfxml_trace_connect_element), free); break; - case A_surfxml_trace_c_connect_kind_LINK_AVAIL: + case A_surfxml_trace_connect_kind_LINK_AVAIL: xbt_dict_set(trace_connect_list_link_avail, - A_surfxml_trace_c_connect_trace, - xbt_strdup(A_surfxml_trace_c_connect_element), free); + A_surfxml_trace_connect_trace, + xbt_strdup(A_surfxml_trace_connect_element), free); break; - case A_surfxml_trace_c_connect_kind_BANDWIDTH: + case A_surfxml_trace_connect_kind_BANDWIDTH: xbt_dict_set(trace_connect_list_bandwidth, - A_surfxml_trace_c_connect_trace, - xbt_strdup(A_surfxml_trace_c_connect_element), free); + A_surfxml_trace_connect_trace, + xbt_strdup(A_surfxml_trace_connect_element), free); break; - case A_surfxml_trace_c_connect_kind_LATENCY: - xbt_dict_set(trace_connect_list_latency, A_surfxml_trace_c_connect_trace, - xbt_strdup(A_surfxml_trace_c_connect_element), free); + case A_surfxml_trace_connect_kind_LATENCY: + xbt_dict_set(trace_connect_list_latency, A_surfxml_trace_connect_trace, + xbt_strdup(A_surfxml_trace_connect_element), free); break; default: - xbt_die(bprintf("Cannot connect trace %s to %s: kind of trace unknown", - A_surfxml_trace_c_connect_trace, - A_surfxml_trace_c_connect_element)); + xbt_die("Cannot connect trace %s to %s: kind of trace unknown", + A_surfxml_trace_connect_trace, A_surfxml_trace_connect_element); + break; } } @@ -1176,9 +801,8 @@ double get_cpu_power(const char *power) generator = xbt_malloc(q - (p + 6) + 1); memcpy(generator, p + 6, q - (p + 6)); generator[q - (p + 6)] = '\0'; - xbt_assert1((random = - xbt_dict_get_or_null(random_data_list, generator)), - "Random generator %s undefined", generator); + random = xbt_dict_get_or_null(random_data_list, generator); + xbt_assert(random, "Random generator %s undefined", generator); power_scale = random_generate(random); } } else { @@ -1188,7 +812,7 @@ double get_cpu_power(const char *power) } double random_min, random_max, random_mean, random_std_deviation, - random_generator; + random_generator; char *random_id; static void init_randomness(void) @@ -1206,134 +830,151 @@ static void add_randomness(void) { /* If needed aditional properties can be added by using the prop tag */ random_data_t random = - random_new(random_generator, 0, random_min, random_max, random_mean, - random_std_deviation); - xbt_dict_set(random_data_list, random_id, (void *) random, NULL); + random_new(random_generator, 0, random_min, random_max, random_mean, + random_std_deviation); + xbt_dict_set(random_data_list, random_id, (void *) random, + &xbt_free_ref); } /** * create CPU resource via CPU Model */ -void surf_host_create_resource(char *name, double power_peak, - double power_scale, - tmgr_trace_t power_trace, - e_surf_resource_state_t state_initial, - tmgr_trace_t state_trace, - xbt_dict_t cpu_properties) -{ - return surf_cpu_model->extension.cpu. - create_resource(name,power_peak,power_scale,power_trace,state_initial,state_trace,cpu_properties); +void* surf_host_create_resource(char *name, double power_peak, + double power_scale, + tmgr_trace_t power_trace, int core, + e_surf_resource_state_t state_initial, + tmgr_trace_t state_trace, + xbt_dict_t cpu_properties) +{ + return surf_cpu_model->extension.cpu.create_resource(name, power_peak, + power_scale, + power_trace, + core, + state_initial, + state_trace, + cpu_properties); } -/* +/** * create CPU resource via worsktation_ptask_L07 model */ -void surf_wsL07_host_create_resource(char *name, double power_peak, - double power_scale, - tmgr_trace_t power_trace, - e_surf_resource_state_t state_initial, - tmgr_trace_t state_trace, - xbt_dict_t cpu_properties) +void* surf_wsL07_host_create_resource(char *name, double power_peak, + double power_scale, + tmgr_trace_t power_trace, + e_surf_resource_state_t state_initial, + tmgr_trace_t state_trace, + xbt_dict_t cpu_properties) { - surf_workstation_model->extension.workstation. - cpu_create_resource(name,power_peak,power_scale,power_trace,state_initial,state_trace,cpu_properties); + return surf_workstation_model->extension.workstation.cpu_create_resource(name, + power_peak, + power_scale, + power_trace, + state_initial, + state_trace, + cpu_properties); } -/* + +/** * create link resource via network Model */ -void surf_link_create_resource(char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t - state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t policy, - xbt_dict_t properties) -{ - return surf_network_model->extension.network. - create_resource(name,bw_initial,bw_trace,lat_initial,lat_trace, - state_initial,state_trace,policy,properties); - +void* surf_link_create_resource(char *name, + double bw_initial, + tmgr_trace_t bw_trace, + double lat_initial, + tmgr_trace_t lat_trace, + e_surf_resource_state_t + state_initial, + tmgr_trace_t state_trace, + e_surf_link_sharing_policy_t policy, + xbt_dict_t properties) +{ + return surf_network_model->extension.network.create_resource(name, + bw_initial, + bw_trace, + lat_initial, + lat_trace, + state_initial, + state_trace, + policy, + properties); } -/* +/** * create link resource via workstation_ptask_L07 model */ -void surf_wsL07_link_create_resource(char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t - state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t - policy, xbt_dict_t properties) +void* surf_wsL07_link_create_resource(char *name, + double bw_initial, + tmgr_trace_t bw_trace, + double lat_initial, + tmgr_trace_t lat_trace, + e_surf_resource_state_t + state_initial, + tmgr_trace_t state_trace, + e_surf_link_sharing_policy_t + policy, xbt_dict_t properties) { - return surf_workstation_model->extension.workstation. - link_create_resource(name,bw_initial,bw_trace,lat_initial,lat_trace, - state_initial,state_trace,policy,properties); + return surf_workstation_model->extension.workstation. + link_create_resource(name, bw_initial, bw_trace, lat_initial, + lat_trace, state_initial, state_trace, policy, + properties); } - /** - * Route: add route element bypassing the parser : - * same job as parse_route_elem + * + *init new routing model component */ -void surf_add_route_element(char* link_ctn_id) +void surf_AS_new(const char *AS_id, const char *AS_mode) { - char *val; - val = xbt_strdup(link_ctn_id); - xbt_dynar_push(route_link_list,&val); + routing_AS_init(AS_id, AS_mode); } -/** - * set route - */ -void surf_route_set_resource(char *source_id,char *destination_id,xbt_dynar_t links_id,int action) + +void surf_AS_finalize(const char *AS_id) { - route_link_list = xbt_dynar_new(sizeof(char *), NULL); - //routing_add_route(source_id,destination_id,links_id,action); // COMMENTED BY DAVID + routing_AS_end(AS_id); +} +/* + * add host to the network element list + */ +void surf_route_add_host(const char *host_id) +{ + routing_add_host(host_id); } /** - * add host to routing host list + * set route */ -void surf_route_add_host(char *host_id) -{ - //routing_add_host(host_id); // COMMENTED BY DAVID +void surf_routing_add_route(const char *src_id, const char *dst_id, + xbt_dynar_t links_id) +{ + unsigned int i; + const char *link_id; + routing_set_route(src_id, dst_id); + xbt_dynar_foreach(links_id, i, link_id) { + routing_add_link(link_id); + } + + //store the route + routing_store_route(); } -/* +/** * Add Traces */ void surf_add_host_traces(void) { - return surf_cpu_model->extension.cpu. - add_traces(); + return surf_cpu_model->extension.cpu.add_traces(); } void surf_add_link_traces(void) { - return surf_network_model->extension.network. - add_traces(); + return surf_network_model->extension.network.add_traces(); } void surf_wsL07_add_traces(void) { - return surf_workstation_model->extension.workstation. - add_traces(); + return surf_workstation_model->extension.workstation.add_traces(); } -/** - * set routes - */ -void surf_set_routes(void) -{ - //routing_set_routes(); // COMMENTED BY DAVID -} -