From ddf6262b78ea331d365560f3c94270a97a6d7763 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Sat, 15 Oct 2016 20:50:07 +0200 Subject: [PATCH] factorize some code between NS3 cluster creation and other clusters --- src/surf/network_ns3.cpp | 50 ++++++--------------------------- src/surf/sg_platf.cpp | 48 +++---------------------------- src/surf/xml/platf_private.hpp | 5 ++-- src/surf/xml/surfxml_sax_cb.cpp | 41 +++++++++++++++++++++++++-- 4 files changed, 55 insertions(+), 89 deletions(-) diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index 148d737eae..ec44e43190 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -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); } diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index db14195376..9987e11df4 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -50,43 +50,6 @@ simgrid::xbt::signal 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 *explodesRadical(const char*radicals){ - std::vector *exploded = new std::vector(); - 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 *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(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 *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) diff --git a/src/surf/xml/platf_private.hpp b/src/surf/xml/platf_private.hpp index 976fa05ba4..e2dcccfcd9 100644 --- a/src/surf/xml/platf_private.hpp +++ b/src/surf/xml/platf_private.hpp @@ -11,6 +11,7 @@ #include "simgrid/host.h" #include "src/surf/xml/platf.hpp" +#include 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* 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* radicals; double speed; double bw; double lat; diff --git a/src/surf/xml/surfxml_sax_cb.cpp b/src/surf/xml/surfxml_sax_cb.cpp index 59565b6f16..b6d60750ce 100644 --- a/src/surf/xml/surfxml_sax_cb.cpp +++ b/src/surf/xml/surfxml_sax_cb.cpp @@ -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* explodesRadical(const char* radicals) +{ + std::vector* exploded = new std::vector(); + 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); } -- 2.20.1