#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;
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);
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. */
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()
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,
* 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
*
#include "xbt/str.h"
#include "xbt/config.h"
#include "instr/instr_private.h"
+#include "surf/surfxml_parse.h"
#ifdef HAVE_LUA
#include <lua.h>
#include <lauxlib.h>
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();
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);
#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)");
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();
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);
}
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);
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);
}
#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");
#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);
}
/* ************************************************************************** */
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();
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)
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)
unsigned int iterator;
void_f_void_t fun;
xbt_dynar_foreach(cb_list, iterator, fun) {
- (*fun) ();
+ if (fun) (*fun) ();
}
}
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)
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);
#include <stdio.h>
#include "surf/surf.h"
+#include "surf/surfxml_parse.h" // for reset callback
#include "xbt/log.h"
XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test,
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 ***********************************/
#include <stdio.h>
#include "surf/surf.h"
+#include "surf/surfxml_parse.h" // for reset callback
#include "xbt/log.h"
XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test,
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);
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);