Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Rewrite the way to do the parsing for host,cluster,peer,router and link.
[simgrid.git] / src / surf / network_ns3.c
index 61e9d07..595dfc5 100644 (file)
@@ -5,6 +5,7 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "surf_private.h"
+#include "surf/maxmin.h"
 #include "surf/ns3/ns3_interface.h"
 #include "xbt/lib.h"
 #include "surf/network_ns3_private.h"
@@ -17,8 +18,6 @@ extern xbt_lib_t as_router_lib;
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_ns3, surf,
                                 "Logging specific to the SURF network NS3 module");
 
-#define MAX_LENGHT_IPV4 16 //255.255.255.255\0
-
 extern routing_global_t global_routing;
 extern xbt_dict_t dict_socket;
 
@@ -52,20 +51,20 @@ static void replace_str(char *str, const char *orig, const char *rep)
   str = xbt_strdup(buffer);
 }
 
-static void replace_bdw_ns3(char * bdw)
+static void replace_bdw_ns3(char ** bdw)
 {
-       char *temp = xbt_strdup(bdw);
-       xbt_free(bdw);
-       bdw = bprintf("%fBps",atof(temp));
+       char *temp = xbt_strdup(*bdw);
+       xbt_free(*bdw);
+       *bdw = bprintf("%fBps",atof(temp));
        xbt_free(temp);
 
 }
 
-static void replace_lat_ns3(char * lat)
+static void replace_lat_ns3(char ** lat)
 {
-       char *temp = xbt_strdup(lat);
-       xbt_free(lat);
-       lat = bprintf("%fs",atof(temp));
+       char *temp = xbt_strdup(*lat);
+       xbt_free(*lat);
+       *lat = bprintf("%fs",atof(temp));
        xbt_free(temp);
 }
 
@@ -89,7 +88,7 @@ void parse_ns3_add_link(void)
 {
        XBT_DEBUG("NS3_ADD_LINK '%s'",A_surfxml_link_id);
 
-       if(!IPV4addr) IPV4addr = xbt_dynar_new(MAX_LENGHT_IPV4*sizeof(char),ns3_free_dynar);
+       if(!IPV4addr) IPV4addr = xbt_dynar_new(sizeof(char*),ns3_free_dynar);
 
        tmgr_trace_t bw_trace;
        tmgr_trace_t state_trace;
@@ -202,8 +201,8 @@ void parse_ns3_add_cluster(void)
        int elmts;
        char * lat = xbt_strdup(cluster_lat);
        char * bw =  xbt_strdup(cluster_bw);
-       replace_lat_ns3(lat);
-       replace_bdw_ns3(bw);
+       replace_lat_ns3(&lat);
+       replace_bdw_ns3(&bw);
 
        xbt_dynar_foreach(tab_elements_num,cpt,elmts)
        {
@@ -217,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);
@@ -228,8 +229,8 @@ void parse_ns3_add_cluster(void)
        //Create link backbone
        lat = xbt_strdup(cluster_bb_lat);
        bw =  xbt_strdup(cluster_bb_bw);
-       replace_lat_ns3(lat);
-       replace_bdw_ns3(bw);
+       replace_lat_ns3(&lat);
+       replace_bdw_ns3(&bw);
        ns3_add_cluster(bw,lat,A_surfxml_cluster_id);
        xbt_free(lat);
        xbt_free(bw);   
@@ -284,8 +285,8 @@ void create_ns3_topology()
      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));
-        replace_lat_ns3(link_lat);
-        replace_bdw_ns3(link_bdw);
+        replace_lat_ns3(&link_lat);
+        replace_bdw_ns3(&link_bdw);
         ((surf_ns3_link_t)link)->created = 0;
 
         //      XBT_DEBUG("src (%s), dst (%s), src_id = %d, dst_id = %d",src,dst, src_id, dst_id);
@@ -303,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);
@@ -407,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)
@@ -423,7 +425,7 @@ static double ns3_share_resources(double min)
         do {
           ns3_simulator(min);
           time_to_next_flow_completion = ns3_time() - surf_get_clock();
-        } while(time_to_next_flow_completion==0.0);
+        } while(double_equals(time_to_next_flow_completion,0));
 
        XBT_DEBUG("min       : %f",min);
        XBT_DEBUG("ns3  time : %f",ns3_time());
@@ -439,13 +441,16 @@ 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;
 
          /* If there are no running flows, just return */
          if (!xbt_swag_size(running_actions)) {
-           while(ns3_time()<now) {
+           while(double_positive(now-ns3_time())) {
              ns3_simulator(now-ns3_time());
            }
            return;
@@ -453,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
@@ -477,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;
 }
 
@@ -534,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;
   }