From: navarrop Date: Fri, 21 Jan 2011 11:21:58 +0000 (+0000) Subject: Correctly set callbacks for tags. X-Git-Tag: v3.6_beta2~459 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/bed0bd887ad1b2584aab20cf8b447df2e3a217aa?ds=sidebyside Correctly set callbacks for tags. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@9470 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/surf/surfxml_parse.h b/include/surf/surfxml_parse.h index cd7be2c858..5f3ae1294e 100644 --- a/include/surf/surfxml_parse.h +++ b/include/surf/surfxml_parse.h @@ -12,10 +12,12 @@ #include "xbt/function_types.h" #include "xbt/dict.h" +char * platform_filename; + SG_BEGIN_DECL() /* Hook for the different tags. All the functions which pointer to are push into here are run when the tag is encountered */ - XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_platform_cb_list; +XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_platform_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_platform_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_host_cb_list; XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_host_cb_list; @@ -54,14 +56,14 @@ XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_config_cb_list; XBT_PUBLIC(void) surf_parse_open(const char *file); XBT_PUBLIC(void) surf_parse_close(void); -XBT_PUBLIC(void) surf_parse_reset_parser(void); XBT_PUBLIC(int) surf_parse_no_callbacks(void); XBT_PUBLIC(void) surf_parse_init_callbacks(void); XBT_PUBLIC(void) surf_parse_reset_callbacks(void); XBT_PUBLIC(void) surf_parse_free_callbacks(void); XBT_PUBLIC(void) surf_parse_get_double(double *value, const char *string); XBT_PUBLIC(void) surf_parse_get_int(int *value, const char *string); - +XBT_PUBLIC(void) surf_parse_add_callback_config(void); +XBT_PUBLIC(void) surf_parse_models_setup(void); /* Prototypes of the functions offered by flex */ XBT_PUBLIC(int) surf_parse_lex(void); XBT_PUBLIC(int) surf_parse_get_lineno(void); @@ -76,7 +78,6 @@ XBT_PUBLIC(int) surf_parse_get_debug(void); XBT_PUBLIC(void) surf_parse_set_debug(int bdebug); XBT_PUBLIC(int) surf_parse_lex_destroy(void); - /* What is needed to bypass the parser. */ XBT_PUBLIC_DATA(int_f_void_t) surf_parse; /* Entry-point to the parser. Set this to your function. */ @@ -109,7 +110,7 @@ extern unsigned int surfxml_buffer_stack_stack[1024]; XBT_PUBLIC(void) surfxml_add_callback(xbt_dynar_t cb_list, void_f_void_t function); -XBT_PUBLIC(void) surfxml_del_callback(xbt_dynar_t * cb_list, +XBT_PUBLIC(void) surfxml_del_callback(xbt_dynar_t cb_list, void_f_void_t function); SG_END_DECL() diff --git a/src/bindings/ruby/simgrid_ruby.c b/src/bindings/ruby/simgrid_ruby.c index 6435003f31..6a4e096e93 100644 --- a/src/bindings/ruby/simgrid_ruby.c +++ b/src/bindings/ruby/simgrid_ruby.c @@ -105,7 +105,7 @@ static void msg_deployApplication(VALUE class, VALUE deploymentFile) rb_raise(rb_eRuntimeError, "Bad Argument's Type for deployApplication "); const char *dep_file = RSTRING_PTR(deploymentFile); - surf_parse_reset_parser(); + surf_parse_reset_callbacks(); surfxml_add_callback(STag_surfxml_process_cb_list, rb_application_handler_on_begin_process); surfxml_add_callback(ETag_surfxml_argument_cb_list, diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 00b33d3f54..af144b6828 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -620,7 +620,6 @@ XBT_PUBLIC(void) surf_init(int *argc, char **argv); /* initialize common str * its code between, say, MSG_init and MSG_create_environment using MSG_config */ XBT_PUBLIC(void) surf_config_models_setup(const char *platform_file); -XBT_PUBLIC(void) surf_config_add_callback(void); /** \brief create the elements of the models * diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 14066967fb..344ec2aef2 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -13,6 +13,7 @@ #include "xbt/str.h" #include "xbt/config.h" #include "instr/instr_private.h" +#include "surf/surfxml_parse.h" #ifdef HAVE_LUA #include #include @@ -170,13 +171,13 @@ void SD_create_environment(const char *platform_file) void *surf_workstation = NULL; void *surf_link = NULL; - //First pass of platform file - surf_config_add_callback(); - parse_platform_file(platform_file); + platform_filename = bprintf("%s",platform_file); + // Reset callbacks + surf_parse_reset_callbacks(); + // Add config callbacks + surf_parse_add_callback_config(); SD_CHECK_INIT_DONE(); - DEBUG0("SD_create_environment"); - surf_config_models_setup(platform_file); parse_platform_file(platform_file); surf_config_models_create_elms(); diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index 15620bb58e..c3b977d0a0 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -111,7 +111,10 @@ void SIMIX_launch_application(const char *file) int parse_status; xbt_assert0(simix_global, "SIMIX_global_init has to be called before SIMIX_launch_application."); - surf_parse_reset_parser(); + + // Reset callbacks + surf_parse_reset_callbacks(); + surfxml_add_callback(STag_surfxml_process_cb_list, parse_process_init); surfxml_add_callback(ETag_surfxml_argument_cb_list, parse_argument); surfxml_add_callback(STag_surfxml_prop_cb_list, parse_properties); diff --git a/src/simix/smx_environment.c b/src/simix/smx_environment.c index 8f60fcc24a..6c461220ba 100644 --- a/src/simix/smx_environment.c +++ b/src/simix/smx_environment.c @@ -9,6 +9,7 @@ #include "xbt/log.h" #include "xbt/xbt_os_time.h" #include "xbt/config.h" +#include "surf/surfxml_parse.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_environment, simix, "Logging specific to SIMIX (environment)"); @@ -38,13 +39,16 @@ void SIMIX_create_environment(const char *file) double start, end; - //First pass of platform file - surf_config_add_callback(); - parse_platform_file(file); + platform_filename = bprintf("%s",file); + + // Reset callbacks + surf_parse_reset_callbacks(); + // Add config callbacks + surf_parse_add_callback_config(); - surf_config_models_setup(file); parse_platform_file(file); surf_config_models_create_elms(); + start = xbt_os_time(); /* FIXME: what time are we measuring ??? */ end = xbt_os_time(); diff --git a/src/surf/cpu.c b/src/surf/cpu.c index b977e50c84..4e3916cb30 100644 --- a/src/surf/cpu.c +++ b/src/surf/cpu.c @@ -139,7 +139,6 @@ static void add_traces_cpu(void) static void cpu_define_callbacks(const char *file) { - surf_parse_reset_parser(); surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_init); surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces_cpu); } diff --git a/src/surf/cpu_im.c b/src/surf/cpu_im.c index fe34934412..7af5accc74 100644 --- a/src/surf/cpu_im.c +++ b/src/surf/cpu_im.c @@ -156,8 +156,6 @@ static void cpu_im_add_traces_cpu(void) static void cpu_im_define_callbacks(const char *file) { - - surf_parse_reset_parser(); surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_im_init); surfxml_add_callback(ETag_surfxml_platform_cb_list, &cpu_im_add_traces_cpu); diff --git a/src/surf/cpu_ti.c b/src/surf/cpu_ti.c index 5408098d3c..b1a06fd299 100644 --- a/src/surf/cpu_ti.c +++ b/src/surf/cpu_ti.c @@ -281,7 +281,6 @@ static void add_traces_cpu_ti(void) static void cpu_ti_define_callbacks(const char *file) { - surf_parse_reset_parser(); surfxml_add_callback(STag_surfxml_host_cb_list, parse_cpu_ti_init); surfxml_add_callback(ETag_surfxml_platform_cb_list, &add_traces_cpu_ti); } diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index c3f9e7916e..6881132494 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -18,6 +18,7 @@ #include "xbt/config.h" #include "xbt/graph.h" #include "xbt/set.h" +#include "surf/surfxml_parse.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route, surf, "Routing part of surf"); @@ -1108,12 +1109,19 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_ #endif } -void surf_config_add_callback(void) +void surf_parse_add_callback_config(void) { - surf_parse_reset_parser(); 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); + surfxml_add_callback(STag_surfxml_AS_cb_list, &surf_parse_models_setup); +} + +void surf_parse_models_setup() +{ + surfxml_del_callback(STag_surfxml_AS_cb_list, surf_parse_models_setup); + surf_config_models_setup(platform_filename); + free(platform_filename); } /* ************************************************************************** */ diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 463c9bb54d..28f70bf1d8 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -215,7 +215,7 @@ void surf_parse_init_callbacks(void) xbt_dynar_new(sizeof(void_f_void_t), NULL); } -void surf_parse_reset_callbacks(void) // FIXME free + init +void surf_parse_reset_callbacks(void) { surf_parse_free_callbacks(); surf_parse_init_callbacks(); @@ -261,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) @@ -461,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) @@ -479,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) (); } } @@ -499,15 +444,12 @@ static void init_data(void) 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_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); } static void free_data(void) diff --git a/src/surf/workstation_ptask_L07.c b/src/surf/workstation_ptask_L07.c index 2190295c09..7a9f6b56c0 100644 --- a/src/surf/workstation_ptask_L07.c +++ b/src/surf/workstation_ptask_L07.c @@ -892,7 +892,6 @@ static void ptask_add_traces(void) static void ptask_define_callbacks(const char *file) { /* Adding callback functions */ - surf_parse_reset_parser(); surfxml_add_callback(STag_surfxml_host_cb_list, &ptask_parse_cpu_init); surfxml_add_callback(STag_surfxml_link_cb_list, &ptask_parse_link_init); surfxml_add_callback(ETag_surfxml_platform_cb_list, &ptask_add_traces); diff --git a/testsuite/surf/surf_usage.c b/testsuite/surf/surf_usage.c index 0384a71346..addd16927a 100644 --- a/testsuite/surf/surf_usage.c +++ b/testsuite/surf/surf_usage.c @@ -12,6 +12,7 @@ #include #include "surf/surf.h" +#include "surf/surfxml_parse.h" // for reset callback #include "xbt/log.h" XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, @@ -51,10 +52,9 @@ void test(char *platform) e_surf_action_state_t stateActionB; e_surf_action_state_t stateActionC; double now = -1.0; - + surf_parse_reset_callbacks(); surf_cpu_model_init_Cas01(platform); /* Now it is possible to use CPUs */ surf_network_model_init_CM02(platform); /* Now it is possible to use eth0 */ - parse_platform_file(platform); /*********************** CPU ***********************************/ diff --git a/testsuite/surf/surf_usage2.c b/testsuite/surf/surf_usage2.c index a2baf5cb0a..4c9e416c30 100644 --- a/testsuite/surf/surf_usage2.c +++ b/testsuite/surf/surf_usage2.c @@ -11,6 +11,7 @@ #include #include "surf/surf.h" +#include "surf/surfxml_parse.h" // for reset callback #include "xbt/log.h" XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, @@ -50,7 +51,7 @@ void test(char *platform) int workstation_id = find_model_description(surf_workstation_model_description, "CLM03"); - + surf_parse_reset_callbacks(); surf_workstation_model_description[workstation_id]. model_init_preparse(platform); parse_platform_file(platform); diff --git a/tools/gras/stub_generator.c b/tools/gras/stub_generator.c index 66c259665d..123911a3e1 100644 --- a/tools/gras/stub_generator.c +++ b/tools/gras/stub_generator.c @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) project_name = argv[1]; - surf_parse_reset_parser(); + surf_parse_reset_callbacks(); DEBUG2("%p %p", parse_process_init, &parse_process_init); surfxml_add_callback(STag_surfxml_process_cb_list, &parse_process_init); surfxml_add_callback(ETag_surfxml_argument_cb_list, &parse_argument);