X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d528b1c80ec6456af1cd0ddff758a5ad2230d322..f25af1e2829458e33a3a0b74c75865c89dff5f9e:/src/surf/surfxml_parse.c diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 749bfa235a..ad572ce2a2 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -112,6 +112,115 @@ static void parse_Stag_trace_connect(void); static void init_randomness(void); static void add_randomness(void); +/* + * This function return 0 or 1 if callbacks are empty or not. + */ +int surf_parse_no_callbacks(void) +{ + return xbt_dynar_is_empty(STag_surfxml_platform_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_platform_cb_list) && + xbt_dynar_is_empty(STag_surfxml_host_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_host_cb_list) && + xbt_dynar_is_empty(STag_surfxml_router_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_router_cb_list) && + xbt_dynar_is_empty(STag_surfxml_link_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_link_cb_list) && + xbt_dynar_is_empty(STag_surfxml_route_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_route_cb_list) && + xbt_dynar_is_empty(STag_surfxml_link_ctn_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_link_ctn_cb_list) && + xbt_dynar_is_empty(STag_surfxml_process_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_process_cb_list) && + xbt_dynar_is_empty(STag_surfxml_argument_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_argument_cb_list) && + xbt_dynar_is_empty(STag_surfxml_prop_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_prop_cb_list) && + xbt_dynar_is_empty(STag_surfxml_trace_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_trace_cb_list) && + xbt_dynar_is_empty(STag_surfxml_trace_connect_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_trace_connect_cb_list) && + xbt_dynar_is_empty(STag_surfxml_random_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_random_cb_list) && + xbt_dynar_is_empty(STag_surfxml_AS_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_AS_cb_list) && + xbt_dynar_is_empty(STag_surfxml_ASroute_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_ASroute_cb_list) && + xbt_dynar_is_empty(STag_surfxml_bypassRoute_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_bypassRoute_cb_list) && + xbt_dynar_is_empty(STag_surfxml_cluster_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_cluster_cb_list) && + xbt_dynar_is_empty(STag_surfxml_peer_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_peer_cb_list) && + xbt_dynar_is_empty(STag_surfxml_config_cb_list) && + xbt_dynar_is_empty(ETag_surfxml_config_cb_list); +} + +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); +} + +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); @@ -152,67 +261,6 @@ void surf_parse_free_callbacks(void) xbt_dynar_free(&ETag_surfxml_config_cb_list); } -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_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 and Etag parse functions */ void STag_surfxml_platform(void) @@ -292,7 +340,7 @@ void surf_parse_open(const char *file) static int warned = 0; /* warn only once */ if (!file) { if (!warned) { - WARN0 + 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; } @@ -352,17 +400,23 @@ 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); + } 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_free(p_cb_list); - *p_cb_list = new_cb_list; + + xbt_dynar_replace(cb_list, it,&null_f); } static XBT_INLINE void surfxml_call_cb_functions(xbt_dynar_t cb_list) @@ -370,7 +424,7 @@ 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) (); } } @@ -381,7 +435,6 @@ 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(); trace_connect_list_power = xbt_dict_new(); @@ -389,16 +442,10 @@ static void init_data(void) trace_connect_list_bandwidth = xbt_dict_new(); trace_connect_list_latency = xbt_dict_new(); - surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties); - if(xbt_dynar_is_empty(STag_surfxml_config_cb_list)) - { - 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_cb_list, &parse_Stag_trace); - surfxml_add_callback(ETag_surfxml_trace_cb_list, &parse_Etag_trace); - surfxml_add_callback(STag_surfxml_trace_connect_cb_list, - &parse_Stag_trace_connect); - } + 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_connect_cb_list, + &parse_Stag_trace_connect); } static void free_data(void) @@ -506,9 +553,8 @@ static void parse_Stag_trace_connect(void) 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_connect_trace, - A_surfxml_trace_connect_element)); + xbt_die("Cannot connect trace %s to %s: kind of trace unknown", + A_surfxml_trace_connect_trace, A_surfxml_trace_connect_element); } }