Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Replace, when possible, calls to bprintf() by calls to xbt_strdup().
[simgrid.git] / src / surf / network_ns3.c
index 7e669dc..31b26d5 100644 (file)
@@ -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;
   }