const char* V_host_coord;
} s_surf_parsing_host_arg_t, *surf_parsing_host_arg_t;
+typedef struct s_surf_parsing_router_arg {
+ const char* V_router_id;
+ const char* V_router_coord;
+} s_surf_parsing_router_arg_t, *surf_parsing_router_arg_t;
+
XBT_PUBLIC(void) sg_platf_new_AS_open(const char *id, const char *mode);
XBT_PUBLIC(void) sg_platf_new_AS_close(void);
XBT_PUBLIC(void) sg_platf_new_host(surf_parsing_host_arg_t h);
+XBT_PUBLIC(void) sg_platf_new_router(surf_parsing_router_arg_t router);
+
#endif /* SG_PLATF_H */
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) ETag_surfxml_host_cb_list;
-XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_router_cb_list;
XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_router_cb_list;
XBT_PUBLIC_DATA(xbt_dynar_t) STag_surfxml_link_cb_list;
XBT_PUBLIC_DATA(xbt_dynar_t) ETag_surfxml_link_cb_list;
/* Managing the parsing callbacks */
typedef void (*surf_parse_host_fct_t)(surf_parsing_host_arg_t);
+typedef void (*surf_parse_router_fct_t)(surf_parsing_router_arg_t);
void surf_parse_host_add_cb(surf_parse_host_fct_t);
+void surf_parse_router_add_cb(surf_parse_router_fct_t);
char* V_cluster_state_file;
} s_surf_parsing_cluster_arg_t;
-typedef struct s_surf_parsing_router_arg *surf_parsing_router_arg_t;
-typedef struct s_surf_parsing_router_arg {
- char* V_router_id;
- char* V_router_coord;
-} s_surf_parsing_router_arg_t;
-
typedef struct s_surf_parsing_link_up_down *surf_parsing_link_up_down_t;
typedef struct s_surf_parsing_link_up_down {
void* link_up;
} s_surf_parsing_link_up_down_t;
-extern surf_parsing_router_arg_t struct_router;
extern surf_parsing_cluster_arg_t struct_cluster;
extern surf_parsing_peer_arg_t struct_peer;
extern surf_parsing_link_arg_t struct_lnk;
}
}
-static void instr_routing_parse_start_router ()
+static void instr_routing_parse_start_router (surf_parsing_router_arg_t router)
{
container_t father = *(container_t*)xbt_dynar_get_ptr(currentContainer, xbt_dynar_length(currentContainer)-1);
- newContainer (struct_router->V_router_id, INSTR_ROUTER, father);
+ newContainer (router->V_router_id, INSTR_ROUTER, father);
}
static void instr_routing_parse_end_platform ()
if (!TRACE_needs_platform()) return;
surfxml_add_callback(STag_surfxml_link_cb_list, &instr_routing_parse_start_link);
surf_parse_host_add_cb(instr_routing_parse_start_host);
- surfxml_add_callback(STag_surfxml_router_cb_list, &instr_routing_parse_start_router);
+ surf_parse_router_add_cb(instr_routing_parse_start_router);
surfxml_add_callback(ETag_surfxml_platform_cb_list, &instr_routing_parse_end_platform);
}
XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_parse);
xbt_dynar_t surf_parse_host_cb_list = NULL; // of functions of type: surf_parsing_host_arg_t -> void
+xbt_dynar_t surf_parse_router_cb_list = NULL; // of functions of type: surf_parsing_router_arg_t -> void
/** Module management function: creates all internal data structures */
void sg_platf_init(void) {
surf_parse_host_cb_list = xbt_dynar_new(sizeof(surf_parse_host_fct_t), NULL);
+ surf_parse_router_cb_list = xbt_dynar_new(sizeof(surf_parse_host_fct_t), NULL);
}
/** Module management function: frees all internal data structures */
void sg_platf_exit(void) {
xbt_dynar_free(&surf_parse_host_cb_list);
+ xbt_dynar_free(&surf_parse_router_cb_list);
}
void sg_platf_new_host(surf_parsing_host_arg_t h){
if (fun) (*fun) (h);
}
}
+void sg_platf_new_router(surf_parsing_router_arg_t router) {
+ unsigned int iterator;
+ surf_parse_router_fct_t fun;
+ xbt_dynar_foreach(surf_parse_router_cb_list, iterator, fun) {
+ if (fun) (*fun) (router);
+ }
+}
+
+
void surf_parse_host_add_cb(surf_parse_host_fct_t fct) {
xbt_dynar_push(surf_parse_host_cb_list, &fct);
}
+void surf_parse_router_add_cb(surf_parse_router_fct_t fct) {
+ xbt_dynar_push(surf_parse_router_cb_list, &fct);
+}
+
/**
* \brief Add a "router" to the network element list
*/
-static void parse_S_router(void)
+static void parse_S_router(surf_parsing_router_arg_t router)
{
network_element_info_t info = NULL;
if (current_routing->hierarchy == SURF_ROUTING_NULL)
current_routing->hierarchy = SURF_ROUTING_BASE;
- xbt_assert(!xbt_lib_get_or_null(as_router_lib,struct_router->V_router_id, ROUTING_ASR_LEVEL),
+ xbt_assert(!xbt_lib_get_or_null(as_router_lib,router->V_router_id, ROUTING_ASR_LEVEL),
"Reading a router, processing unit \"%s\" already exists",
- struct_router->V_router_id);
+ router->V_router_id);
xbt_assert(current_routing->set_processing_unit,
"no defined method \"set_processing_unit\" in \"%s\"",
current_routing->name);
(*(current_routing->set_processing_unit)) (current_routing,
- struct_router->V_router_id);
+ router->V_router_id);
info = xbt_new0(s_network_element_info_t, 1);
info->rc_component = current_routing;
info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
- xbt_lib_set(as_router_lib,struct_router->V_router_id,ROUTING_ASR_LEVEL,(void *) info);
+ xbt_lib_set(as_router_lib,router->V_router_id,ROUTING_ASR_LEVEL,(void *) info);
if (strcmp(A_surfxml_router_coordinates,"")) {
if(!COORD_ASR_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'");
xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " ");
xbt_dynar_shrink(ctn, 0);
- xbt_lib_set(as_router_lib,struct_router->V_router_id,COORD_ASR_LEVEL,(void *) ctn);
+ xbt_lib_set(as_router_lib,router->V_router_id,COORD_ASR_LEVEL,(void *) ctn);
}
}
/**
* brief Add a "router" to the network element list from XML description
*/
-static void parse_S_router_XML(void)
-{
- return parse_S_router();
-}
-
-/**
- * brief Add a "router" to the network element list from XML description
- */
-static void parse_S_router_lua(const char* router_id)
-{
- struct_router->V_router_id = xbt_strdup(router_id);
- struct_router->V_router_coord = xbt_strdup("");
- return parse_S_router();
+static void parse_S_router_lua(const char* router_id) {
+ s_surf_parsing_router_arg_t router;
+ memset(&router,0,sizeof(router));
+ router.V_router_id = router_id;
+ router.V_router_coord = "";
+ return parse_S_router(&router);
}
/**
/* parse generic elements */
surf_parse_host_add_cb(parse_S_host_XML);
surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML);
- surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router_XML);
+ surf_parse_router_add_cb(parse_S_router);
surfxml_add_callback(STag_surfxml_route_cb_list,
&parse_S_route_new_and_endpoints_XML);
xbt_dynar_t STag_surfxml_platform_cb_list = NULL;
xbt_dynar_t ETag_surfxml_platform_cb_list = NULL;
xbt_dynar_t ETag_surfxml_host_cb_list = NULL;
-xbt_dynar_t STag_surfxml_router_cb_list = NULL;
xbt_dynar_t ETag_surfxml_router_cb_list = NULL;
xbt_dynar_t STag_surfxml_link_cb_list = NULL;
xbt_dynar_t ETag_surfxml_link_cb_list = NULL;
sg_platf_init();
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);
xbt_dynar_free(&STag_surfxml_platform_cb_list);
xbt_dynar_free(&ETag_surfxml_platform_cb_list);
xbt_dynar_free(&ETag_surfxml_host_cb_list);
- xbt_dynar_free(&STag_surfxml_router_cb_list);
xbt_dynar_free(&ETag_surfxml_router_cb_list);
xbt_dynar_free(&STag_surfxml_link_cb_list);
xbt_dynar_free(&ETag_surfxml_link_cb_list);
void STag_surfxml_router(void){
- struct_router = xbt_new0(s_surf_parsing_router_arg_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);
+ s_surf_parsing_router_arg_t router;
+ memset(&router, 0, sizeof(router));
+
+ router.V_router_id = xbt_strdup(A_surfxml_router_id);
+ router.V_router_coord = xbt_strdup(A_surfxml_router_coordinates);
+ sg_platf_new_router(&router);
}
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){