Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
factorize some code between NS3 cluster creation and other clusters
authorMartin Quinson <martin.quinson@loria.fr>
Sat, 15 Oct 2016 18:50:07 +0000 (20:50 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Sat, 15 Oct 2016 18:50:07 +0000 (20:50 +0200)
src/surf/network_ns3.cpp
src/surf/sg_platf.cpp
src/surf/xml/platf_private.hpp
src/surf/xml/surfxml_sax_cb.cpp

index 148d737..ec44e43 100644 (file)
@@ -80,47 +80,16 @@ static void ns3_add_netcard(simgrid::kernel::routing::NetCard* netcard)
 #include "src/surf/xml/platf.hpp" // FIXME: move that back to the parsing area
 static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
 {
-  xbt_dynar_t tab_elements_num = xbt_dynar_new(sizeof(int), nullptr);
+  char* lat = bprintf("%fs", cluster->lat);
+  char* bw  = bprintf("%fBps", cluster->bw);
 
-  xbt_dynar_t radical_elements = xbt_str_split(cluster->radical, ",");
-  unsigned int iter;
-  const char* groups = nullptr;
-  xbt_dynar_foreach(radical_elements, iter, groups) {
-    xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
-
-    if (xbt_dynar_length(radical_ends) == 1) {
-      int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
-      xbt_dynar_push_as(tab_elements_num, int, start);
-      char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, start, cluster->suffix);
-      simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
-      XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
-      free(router_id);
-
-    } else if (xbt_dynar_length(radical_ends) == 2) {
-      int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
-      int end   = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char*));
-      for (int i = start; i <= end; i++) {
-        xbt_dynar_push_as(tab_elements_num, int, i);
-        char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, i, cluster->suffix);
-        simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
-        XBT_DEBUG("NS3_ADD_ROUTER '%s'",router_id);
-        free(router_id);
-      }
-
-    } else {
-      XBT_DEBUG("Malformed radical");
-    }
-  }
+  for (int i : *cluster->radicals) {
+    char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, i, cluster->suffix);
+    simgrid::s4u::Host::by_name_or_create(router_id)->extension_set(NS3_EXTENSION_ID, ns3_add_host_cluster(router_id));
+    XBT_DEBUG("NS3_ADD_ROUTER '%s'", router_id);
 
-  //Create links
-  unsigned int cpt;
-  int elmts;
-  char * lat = bprintf("%fs", cluster->lat);
-  char * bw =  bprintf("%fBps", cluster->bw);
-
-  xbt_dynar_foreach(tab_elements_num,cpt,elmts) {
-    char* host_id   = bprintf("%s%d%s", cluster->prefix, elmts, cluster->suffix);
-    char* router_id = bprintf("ns3_%s%d%s", cluster->prefix, elmts, cluster->suffix);
+    // Create private link
+    char* host_id = bprintf("%s%d%s", cluster->prefix, i, cluster->suffix);
     XBT_DEBUG("Create link from '%s' to '%s'",host_id,router_id);
 
     ns3_node_t host_src = ns3_find_host(host_id);
@@ -135,14 +104,13 @@ static void parse_ns3_add_cluster(sg_platf_cluster_cbarg_t cluster)
   }
   xbt_free(lat);
   xbt_free(bw);
-  xbt_dynar_free(&tab_elements_num);
-
 
   //Create link backbone
   lat = bprintf("%fs", cluster->bb_lat);
   bw =  bprintf("%fBps", cluster->bb_bw);
   ns3_add_cluster(bw,lat,cluster->id);
   xbt_free(lat);
+
   xbt_free(bw);
 }
 
index db14195..9987e11 100644 (file)
@@ -50,43 +50,6 @@ simgrid::xbt::signal<void(void)> on_postparse;
 
 static int surf_parse_models_setup_already_called = 0;
 
-/* Turn something like "1-4,6,9-11" into the vector {1,2,3,4,6,9,10,11} */
-static std::vector<int> *explodesRadical(const char*radicals){
-  std::vector<int> *exploded = new std::vector<int>();
-  char *groups;
-  unsigned int iter;
-
-  //Make all hosts
-  xbt_dynar_t radical_elements = xbt_str_split(radicals, ",");
-  xbt_dynar_foreach(radical_elements, iter, groups) {
-
-    xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
-    int start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
-    int end=0;
-
-    switch (xbt_dynar_length(radical_ends)) {
-    case 1:
-      end = start;
-      break;
-    case 2:
-      end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
-      break;
-    default:
-      surf_parse_error("Malformed radical: %s", groups);
-      break;
-    }
-
-    for (int i = start; i <= end; i++)
-      exploded->push_back( i );
-
-    xbt_dynar_free(&radical_ends);
-  }
-  xbt_dynar_free(&radical_elements);
-
-  return exploded;
-}
-
-
 /** The current AS in the parsing */
 static simgrid::kernel::routing::AsImpl *current_routing = nullptr;
 static simgrid::kernel::routing::AsImpl *routing_get_current()
@@ -281,8 +244,7 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster)
     current_as->hasLimiter_ = 1;
   }
 
-  std::vector<int> *radicals = explodesRadical(cluster->radical);
-  for (int i : *radicals) {
+  for (int i : *cluster->radicals) {
     char * host_id = bprintf("%s%d%s", cluster->prefix, i, cluster->suffix);
     char * link_id = bprintf("%s_link_%d", cluster->id, i);
 
@@ -366,7 +328,6 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster)
     xbt_free(host_id);
     rankId++;
   }
-  delete radicals;
 
   // Add a router. It is magically used thanks to the way in which surf_routing_cluster is written,
   // and it's very useful to connect clusters together
@@ -402,6 +363,7 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster)
   sg_platf_new_AS_seal();
 
   simgrid::surf::on_cluster(cluster);
+  delete cluster->radicals;
 }
 void routing_cluster_add_backbone(simgrid::surf::Link* bb) {
   simgrid::kernel::routing::AsCluster *cluster = dynamic_cast<simgrid::kernel::routing::AsCluster*>(current_routing);
@@ -415,9 +377,7 @@ void routing_cluster_add_backbone(simgrid::surf::Link* bb) {
 
 void sg_platf_new_cabinet(sg_platf_cabinet_cbarg_t cabinet)
 {
-  std::vector<int> *radicals = explodesRadical(cabinet->radical);
-
-  for (int radical : *radicals) {
+  for (int radical : *cabinet->radicals) {
     char *hostname = bprintf("%s%d%s", cabinet->prefix, radical, cabinet->suffix);
     s_sg_platf_host_cbarg_t host;
     memset(&host, 0, sizeof(host));
@@ -447,7 +407,7 @@ void sg_platf_new_cabinet(sg_platf_cabinet_cbarg_t cabinet)
 
     free(hostname);
   }
-  delete(radicals);
+  delete cabinet->radicals;
 }
 
 void sg_platf_new_storage(sg_platf_storage_cbarg_t storage)
index 976fa05..e2dcccf 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "simgrid/host.h"
 #include "src/surf/xml/platf.hpp"
+#include <vector>
 
 SG_BEGIN_DECL()
 #include "src/surf/xml/simgrid_dtd.h"
@@ -100,7 +101,7 @@ typedef struct s_sg_platf_cluster_cbarg {
   const char* id;
   const char* prefix;
   const char* suffix;
-  const char* radical;
+  std::vector<int>* radicals;
   double speed;
   int core_amount;
   double bw;
@@ -123,7 +124,7 @@ typedef struct s_sg_platf_cabinet_cbarg {
   const char* id;
   const char* prefix;
   const char* suffix;
-  const char* radical;
+  std::vector<int>* radicals;
   double speed;
   double bw;
   double lat;
index 59565b6..b6d6075 100644 (file)
@@ -81,6 +81,43 @@ int surf_parse_get_int(const char *string) {
   return res;
 }
 
+/* Turn something like "1-4,6,9-11" into the vector {1,2,3,4,6,9,10,11} */
+static std::vector<int>* explodesRadical(const char* radicals)
+{
+  std::vector<int>* exploded = new std::vector<int>();
+  char* groups;
+  unsigned int iter;
+
+  // Make all hosts
+  xbt_dynar_t radical_elements = xbt_str_split(radicals, ",");
+  xbt_dynar_foreach (radical_elements, iter, groups) {
+
+    xbt_dynar_t radical_ends = xbt_str_split(groups, "-");
+    int start                = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char*));
+    int end                  = 0;
+
+    switch (xbt_dynar_length(radical_ends)) {
+      case 1:
+        end = start;
+        break;
+      case 2:
+        end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char*));
+        break;
+      default:
+        surf_parse_error("Malformed radical: %s", groups);
+        break;
+    }
+
+    for (int i = start; i <= end; i++)
+      exploded->push_back(i);
+
+    xbt_dynar_free(&radical_ends);
+  }
+  xbt_dynar_free(&radical_elements);
+
+  return exploded;
+}
+
 struct unit_scale {
   const char *unit;
   double scale;
@@ -511,7 +548,7 @@ void ETag_surfxml_cluster(){
   cluster.id          = A_surfxml_cluster_id;
   cluster.prefix      = A_surfxml_cluster_prefix;
   cluster.suffix      = A_surfxml_cluster_suffix;
-  cluster.radical     = A_surfxml_cluster_radical;
+  cluster.radicals    = explodesRadical(A_surfxml_cluster_radical);
   cluster.speed       = surf_parse_get_speed(A_surfxml_cluster_speed, "speed of cluster", cluster.id);
   cluster.core_amount = surf_parse_get_int(A_surfxml_cluster_core);
   cluster.bw          = surf_parse_get_bandwidth(A_surfxml_cluster_bw, "bw of cluster", cluster.id);
@@ -596,7 +633,7 @@ void STag_surfxml_cabinet(){
   cabinet.speed   = surf_parse_get_speed(A_surfxml_cabinet_speed, "speed of cabinet", cabinet.id);
   cabinet.bw      = surf_parse_get_bandwidth(A_surfxml_cabinet_bw, "bw of cabinet", cabinet.id);
   cabinet.lat     = surf_parse_get_time(A_surfxml_cabinet_lat, "lat of cabinet", cabinet.id);
-  cabinet.radical = A_surfxml_cabinet_radical;
+  cabinet.radicals = explodesRadical(A_surfxml_cabinet_radical);
 
   sg_platf_new_cabinet(&cabinet);
 }