X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f10f38b953c9cb8604392b92030cfe2d437a3c9c..f13ab1807d381f0bf36027a9042e046dc4735dd5:/src/surf/network_ns3.c diff --git a/src/surf/network_ns3.c b/src/surf/network_ns3.c index 7e669dc4d4..31b26d5a81 100644 --- a/src/surf/network_ns3.c +++ b/src/surf/network_ns3.c @@ -216,7 +216,9 @@ void parse_ns3_add_cluster(void) if(host_src && host_dst){} else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); - ns3_add_link(host_src->node_num,host_dst->node_num,bw,lat); + ns3_add_link(host_src->node_num,host_src->type, + host_dst->node_num,host_dst->type, + bw,lat); free(router_id); free(host_id); @@ -281,8 +283,8 @@ void create_ns3_topology() if( strcmp(src,dst) && ((surf_ns3_link_t)link)->created){ XBT_DEBUG("Route from '%s' to '%s' with link '%s'",src,dst,((surf_ns3_link_t)link)->data->id); - char * link_bdw = bprintf("%s",((surf_ns3_link_t)link)->data->bdw); - char * link_lat = bprintf("%s",(((surf_ns3_link_t)link)->data->lat)); + char * link_bdw = xbt_strdup(((surf_ns3_link_t)link)->data->bdw); + char * link_lat = xbt_strdup(((surf_ns3_link_t)link)->data->lat); replace_lat_ns3(&link_lat); replace_bdw_ns3(&link_bdw); ((surf_ns3_link_t)link)->created = 0; @@ -302,7 +304,7 @@ void create_ns3_topology() if(host_src && host_dst){} else xbt_die("\tns3_add_link from %d to %d",host_src->node_num,host_dst->node_num); - ns3_add_link(host_src->node_num,host_dst->node_num,link_bdw,link_lat); + ns3_add_link(host_src->node_num,host_src->type,host_dst->node_num,host_dst->type,link_bdw,link_lat); xbt_free(link_bdw); xbt_free(link_lat); @@ -310,7 +312,7 @@ void create_ns3_topology() } } -static void define_callbacks_ns3(const char *filename) +static void define_callbacks_ns3(void) { surfxml_add_callback(STag_surfxml_host_cb_list, &parse_ns3_add_host); //HOST surfxml_add_callback(STag_surfxml_router_cb_list, &parse_ns3_add_router); //ROUTER @@ -355,7 +357,7 @@ static void ns3_action_set_category(surf_action_t action, const char *category) } #endif -void surf_network_model_init_NS3(const char *filename) +void surf_network_model_init_NS3() { if (surf_network_model) return; @@ -387,7 +389,7 @@ void surf_network_model_init_NS3(const char *filename) } routing_model_create(sizeof(s_surf_ns3_link_t), NULL, NULL); - define_callbacks_ns3(filename); + define_callbacks_ns3(); NS3_HOST_LEVEL = xbt_lib_add_level(host_lib,(void_f_pvoid_t)free_ns3_host); NS3_ASR_LEVEL = xbt_lib_add_level(as_router_lib,(void_f_pvoid_t)free_ns3_host); @@ -406,6 +408,7 @@ static void finalize(void) { ns3_finalize(); xbt_dynar_free_container(&IPV4addr); + xbt_dict_free(&dict_socket); } static double ns3_share_resources(double min) @@ -438,6 +441,9 @@ static void ns3_update_actions_state(double now, double delta) char *key; void *data; + static xbt_dynar_t socket_to_destroy = NULL; + if(!socket_to_destroy) socket_to_destroy = xbt_dynar_new(sizeof(char*),NULL); + surf_action_network_ns3_t action = NULL; xbt_swag_t running_actions = surf_network_model->states.running_action_set; @@ -452,6 +458,7 @@ static void ns3_update_actions_state(double now, double delta) xbt_dict_foreach(dict_socket,cursor,key,data){ action = (surf_action_network_ns3_t)ns3_get_socket_action(data); + XBT_DEBUG("Processing socket %p (action %p)",data,action); action->generic_action.remains = action->generic_action.cost - ns3_get_socket_sent(data); #ifdef HAVE_TRACING @@ -476,10 +483,21 @@ static void ns3_update_actions_state(double now, double delta) #endif if(ns3_get_socket_is_finished(data) == 1){ + xbt_dynar_push(socket_to_destroy,&key); + XBT_DEBUG("Destroy socket %p of action %p", key, action); action->generic_action.finish = now; surf_action_state_set(&(action->generic_action), SURF_ACTION_DONE); } } + + while (xbt_dynar_length(socket_to_destroy)){ + xbt_dynar_pop(socket_to_destroy,&key); + + void *data = xbt_dict_get (dict_socket, key); + surf_action_network_ns3_t action = (surf_action_network_ns3_t)ns3_get_socket_action(data); + XBT_DEBUG ("Removing socket %p of action %p", key, action); + xbt_dict_remove(dict_socket,key); + } return; } @@ -533,7 +551,7 @@ static int action_unref(surf_action_t action) if (action->category) xbt_free(action->category); #endif - + XBT_DEBUG ("Removing action %p", action); surf_action_free(&action); return 1; }