X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/8dcab2e3c296d3bf6ec701ccba85b45856c67e7e..ff1eebe3071b50372f9bf3048eeec04c610d2788:/src/surf/surfxml_parse.c?ds=sidebyside diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 8691238417..53db2901e8 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -24,6 +24,37 @@ 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 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) + old_buff = surfxml_bufferstack; + else { + xbt_dynar_push(surfxml_bufferstack_stack, &surfxml_bufferstack); + surfxml_bufferstack = xbt_new0(char, surfxml_bufferstack_size); + } +} + +void surfxml_bufferstack_pop(int new) +{ + if (!new) + surfxml_bufferstack = old_buff; + else { + free(surfxml_bufferstack); + xbt_dynar_pop(surfxml_bufferstack_stack, &surfxml_bufferstack); + } +} + /* 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; @@ -35,18 +66,20 @@ 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_cluster_cb_list = NULL; +xbt_dynar_t ETag_surfxml_cluster_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; @@ -70,7 +103,7 @@ 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); @@ -87,8 +120,8 @@ 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); @@ -97,8 +130,8 @@ void surf_parse_free_callbacks(void) xbt_dynar_free(&ETag_surfxml_prop_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); @@ -107,6 +140,8 @@ void surf_parse_free_callbacks(void) 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); } void surf_parse_reset_parser(void) @@ -122,8 +157,8 @@ void surf_parse_reset_parser(void) 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_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); @@ -132,8 +167,8 @@ void surf_parse_reset_parser(void) 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_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_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); @@ -142,6 +177,8 @@ void surf_parse_reset_parser(void) 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 and Etag parse functions */ @@ -183,16 +220,17 @@ parse_method(S,host); parse_method(E,host); parse_method(S,router); parse_method(E,router); parse_method(S,link); parse_method(E,link); parse_method(S,route); parse_method(E,route); -parse_method(S,link_c_ctn); parse_method(E,link_c_ctn); +parse_method(S,link_ctn); parse_method(E,link_ctn); parse_method(S,process); parse_method(E,process); parse_method(S,argument); parse_method(E,argument); parse_method(S,prop); parse_method(E,prop); parse_method(S,trace); parse_method(E,trace); -parse_method(S,trace_c_connect); parse_method(E,trace_c_connect); +parse_method(S,trace_connect); parse_method(E,trace_connect); parse_method(S,random); parse_method(E,random); parse_method(S,AS); parse_method(E,AS); parse_method(S,ASroute); parse_method(E,ASroute); parse_method(S,bypassRoute); parse_method(E,bypassRoute); +parse_method(S,cluster); parse_method(E,cluster); /* Open and Close parse file */ @@ -286,6 +324,9 @@ static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t cb_list) static void init_data(void) { + if (!surfxml_bufferstack_stack) + surfxml_bufferstack_stack = xbt_dynar_new(sizeof(char *), NULL); + random_data_list = xbt_dict_new(); traces_set_list = xbt_dict_new(); trace_connect_list_host_avail = xbt_dict_new(); @@ -299,7 +340,7 @@ static void init_data(void) surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); 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_trace_connect_cb_list, &parse_Stag_trace_connect); } static void free_data(void) @@ -311,6 +352,7 @@ static void free_data(void) 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 */ @@ -318,6 +360,10 @@ static void free_data(void) 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(); @@ -366,42 +412,42 @@ static void parse_Etag_trace(void) xbt_dict_set(traces_set_list, trace_id, (void *) trace, 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), + (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)); + A_surfxml_trace_connect_trace, + A_surfxml_trace_connect_element)); } } @@ -448,7 +494,7 @@ 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, &xbt_free_ref); // FIX BY DAVID, add the xbt_free_ref function + xbt_dict_set(random_data_list, random_id, (void *) random, &xbt_free_ref); } /** @@ -519,35 +565,43 @@ void surf_wsL07_link_create_resource(char *name, } /** - * 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) { - xbt_die("\"surf_add_route_element\" not support"); -// 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) { - xbt_die("\"surf_route_set_resource\" not support"); - //route_link_list = xbt_dynar_new(sizeof(char *), NULL); // COMMENTED BY DAVID - //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) +void surf_routing_add_route(const char *src_id,const char *dst_id,xbt_dynar_t links_id) { - xbt_die("\"surf_route_add_host\" not support"); - //routing_add_host(host_id); // COMMENTED BY DAVID + 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(); } /** @@ -568,11 +622,3 @@ void surf_wsL07_add_traces(void) return surf_workstation_model->extension.workstation.add_traces(); } -/** - * set routes - */ -void surf_set_routes(void) -{ - xbt_die("\"surf_set_routes\" not support"); - //routing_set_routes(); // COMMENTED BY DAVID -} \ No newline at end of file