From 7cd7ddd52235514ae35982529da77668e261b756 Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Fri, 19 Aug 2016 09:25:45 +0200 Subject: [PATCH] use vector for privateLinks_ + fought hard against this one :/ + emptty, have a look please --- include/simgrid/s4u/As.hpp | 2 +- src/kernel/routing/AsCluster.cpp | 21 +++++++-------- src/kernel/routing/AsCluster.hpp | 2 +- src/kernel/routing/AsClusterDragonfly.cpp | 6 ++--- src/kernel/routing/AsClusterTorus.cpp | 8 +++--- src/kernel/routing/AsVivaldi.cpp | 8 +++--- src/surf/sg_platf.cpp | 33 ++++++++++++++++------- 7 files changed, 46 insertions(+), 34 deletions(-) diff --git a/include/simgrid/s4u/As.hpp b/include/simgrid/s4u/As.hpp index 852692c261..7de5a3642c 100644 --- a/include/simgrid/s4u/As.hpp +++ b/include/simgrid/s4u/As.hpp @@ -61,7 +61,7 @@ public: protected: char *name_ = nullptr; xbt_dict_t children_ = xbt_dict_new_homogeneous(nullptr); // sub-ASes - std::vectorvertices_; // our content, as known to our graph routing algorithm (maps vertexId -> vertex) + std::vector vertices_; // our content, as known to our graph routing algorithm (maps vertexId -> vertex) std::map, std::vector*> bypassRoutes_; // srcName x dstName -> route diff --git a/src/kernel/routing/AsCluster.cpp b/src/kernel/routing/AsCluster.cpp index fd5f54064e..94e2f14afb 100644 --- a/src/kernel/routing/AsCluster.cpp +++ b/src/kernel/routing/AsCluster.cpp @@ -17,21 +17,18 @@ namespace routing { AsCluster::AsCluster(const char*name) : AsImpl(name) {} - AsCluster::~AsCluster() - { - xbt_dynar_free(&privateLinks_); - } + AsCluster::~AsCluster()=default; void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat) { s_surf_parsing_link_up_down_t info; XBT_VERB("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]", src->name(), src->id(), dst->name(), dst->id()); - xbt_assert(!xbt_dynar_is_empty(privateLinks_), "Cluster routing : no links attached to the source node - did you use host_link tag?"); + xbt_assert(!privateLinks_.empty(), "Cluster routing : no links attached to the source node - did you use host_link tag?"); if (! src->isRouter()) { // No specific link for router if((src->id() == dst->id()) && hasLoopback_ ){ - info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(src->id() * linkCountPerNode_); route->link_list->push_back(info.linkUp); if (lat) *lat += info.linkUp->getLatency(); @@ -40,11 +37,11 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb if (hasLimiter_){ // limiter for sender - info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_ + (hasLoopback_?1:0), s_surf_parsing_link_up_down_t); + info = privateLinks_.at(src->id() * linkCountPerNode_ + (hasLoopback_?1:0)); route->link_list->push_back((Link*)info.linkUp); } - info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_ + (hasLoopback_?1:0) + (hasLimiter_?1:0), s_surf_parsing_link_up_down_t); + info = privateLinks_.at(src->id() * linkCountPerNode_ + (hasLoopback_?1:0) + (hasLimiter_?1:0)); if (info.linkUp) { // link up route->link_list->push_back(info.linkUp); if (lat) @@ -60,7 +57,7 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb } if (! dst->isRouter()) { // No specific link for router - info = xbt_dynar_get_as(privateLinks_, dst->id() * linkCountPerNode_ + hasLoopback_ + hasLimiter_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(dst->id() * linkCountPerNode_ + hasLoopback_ + hasLimiter_); if (info.linkDown) { // link down route->link_list->push_back(info.linkDown); @@ -68,7 +65,7 @@ void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb *lat += info.linkDown->getLatency(); } if (hasLimiter_){ // limiter for receiver - info = xbt_dynar_get_as(privateLinks_, dst->id() * linkCountPerNode_ + hasLoopback_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(dst->id() * linkCountPerNode_ + hasLoopback_); route->link_list->push_back(info.linkUp); } } @@ -96,7 +93,7 @@ void AsCluster::getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) if (! src->isRouter()) { previous = new_xbt_graph_node(graph, src->name(), nodes); - info = xbt_dynar_get_as(privateLinks_, src->id(), s_surf_parsing_link_up_down_t); + info = privateLinks_.at(src->id()); if (info.linkUp) { // link up const char *link_name = static_cast(info.linkUp)->getName(); @@ -149,7 +146,7 @@ void AsCluster::create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, info.linkUp = Link::byName(link_id); info.linkDown = info.linkUp; } - xbt_dynar_set(privateLinks_, position, &info); + privateLinks_.insert(privateLinks_.begin()+position, info); xbt_free(link_id); } diff --git a/src/kernel/routing/AsCluster.hpp b/src/kernel/routing/AsCluster.hpp index 7a8d4e3bea..013ca08bc6 100644 --- a/src/kernel/routing/AsCluster.hpp +++ b/src/kernel/routing/AsCluster.hpp @@ -23,7 +23,7 @@ public: virtual void create_links_for_node(sg_platf_cluster_cbarg_t cluster, int id, int rank, int position); virtual void parse_specific_arguments(sg_platf_cluster_cbarg_t cluster) {} - xbt_dynar_t privateLinks_ = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),nullptr); + std::vector privateLinks_; Link* backbone_ = nullptr; void *loopback_ = nullptr; diff --git a/src/kernel/routing/AsClusterDragonfly.cpp b/src/kernel/routing/AsClusterDragonfly.cpp index cec68d8aac..cfdb63a4ef 100644 --- a/src/kernel/routing/AsClusterDragonfly.cpp +++ b/src/kernel/routing/AsClusterDragonfly.cpp @@ -245,7 +245,7 @@ void AsClusterDragonfly::getRouteAndLatency(NetCard * src, NetCard * dst, sg_pla XBT_VERB("dragonfly_get_route_and_latency from '%s'[%d] to '%s'[%d]", src->name(), src->id(), dst->name(), dst->id()); if ((src->id() == dst->id()) && hasLoopback_) { - s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_, s_surf_parsing_link_up_down_t); + s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id() * linkCountPerNode_); route->link_list->push_back(info.linkUp); if (latency) @@ -270,7 +270,7 @@ void AsClusterDragonfly::getRouteAndLatency(NetCard * src, NetCard * dst, sg_pla if (hasLimiter_) { // limiter for sender s_surf_parsing_link_up_down_t info; - info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_ + hasLoopback_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(src->id() * linkCountPerNode_ + hasLoopback_); route->link_list->push_back(info.linkUp); } @@ -327,7 +327,7 @@ void AsClusterDragonfly::getRouteAndLatency(NetCard * src, NetCard * dst, sg_pla if (hasLimiter_) { // limiter for receiver s_surf_parsing_link_up_down_t info; - info = xbt_dynar_get_as(privateLinks_, dst->id() * linkCountPerNode_ + hasLoopback_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(dst->id() * linkCountPerNode_ + hasLoopback_); route->link_list->push_back(info.linkUp); } diff --git a/src/kernel/routing/AsClusterTorus.cpp b/src/kernel/routing/AsClusterTorus.cpp index 55a46067c6..b88ed42d4e 100644 --- a/src/kernel/routing/AsClusterTorus.cpp +++ b/src/kernel/routing/AsClusterTorus.cpp @@ -78,7 +78,7 @@ namespace simgrid { * note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?) * holds the link "rankId->rankId" */ - xbt_dynar_set(privateLinks_, position + j, &info); + privateLinks_.insert(privateLinks_.begin() + position + j, info); dim_product *= current_dimension; xbt_free(link_id); } @@ -118,7 +118,7 @@ namespace simgrid { return; if ((src->id() == dst->id()) && hasLoopback_) { - s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(privateLinks_, src->id() * linkCountPerNode_, s_surf_parsing_link_up_down_t); + s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id() * linkCountPerNode_); route->link_list->push_back(info.linkUp); if (lat) @@ -200,11 +200,11 @@ namespace simgrid { s_surf_parsing_link_up_down_t info; if (hasLimiter_) { // limiter for sender - info = xbt_dynar_get_as(privateLinks_, nodeOffset + hasLoopback_, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(nodeOffset + hasLoopback_); route->link_list->push_back(info.linkUp); } - info = xbt_dynar_get_as(privateLinks_, linkOffset, s_surf_parsing_link_up_down_t); + info = privateLinks_.at(linkOffset); if (use_lnk_up == false) { route->link_list->push_back(info.linkDown); diff --git a/src/kernel/routing/AsVivaldi.cpp b/src/kernel/routing/AsVivaldi.cpp index c25b4e026f..c922633842 100644 --- a/src/kernel/routing/AsVivaldi.cpp +++ b/src/kernel/routing/AsVivaldi.cpp @@ -68,16 +68,16 @@ void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cb } /* Retrieve the private links */ - if ((int)xbt_dynar_length(privateLinks_) > src->id()) { - s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(privateLinks_, src->id(), s_surf_parsing_link_up_down_t); + if (static_cast(privateLinks_.size()) > src->id()) { + s_surf_parsing_link_up_down_t info = privateLinks_.at(src->id()); if(info.linkUp) { route->link_list->push_back(info.linkUp); if (lat) *lat += info.linkUp->getLatency(); } } - if ((int)xbt_dynar_length(privateLinks_)>dst->id()) { - s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(privateLinks_, dst->id(), s_surf_parsing_link_up_down_t); + if (static_cast(privateLinks_.size()) >dst->id()) { + s_surf_parsing_link_up_down_t info = privateLinks_.at(dst->id()); if(info.linkDown) { route->link_list->push_back(info.linkDown); if (lat) diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 19d8243883..b69168e344 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -310,7 +310,8 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) XBT_DEBUG("", link_id, cluster->bw, cluster->lat); - s_surf_parsing_link_up_down_t info_lim, info_loop; + s_surf_parsing_link_up_down_t info_lim; + s_surf_parsing_link_up_down_t info_loop; // All links are saved in a matrix; // every row describes a single node; every node may have multiple links. // the first column may store a link from x to x if p_has_loopback is set @@ -328,10 +329,18 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) link.latency = cluster->loopback_lat; link.policy = SURF_LINK_FATPIPE; sg_platf_new_link(&link); - info_loop.linkUp = info_loop.linkDown = Link::byName(tmp_link); + info_loop.linkUp = Link::byName(tmp_link); + info_loop.linkDown = Link::byName(tmp_link); free(tmp_link); auto as_cluster = static_cast(current_as); - xbt_dynar_set(as_cluster->privateLinks_, rankId*as_cluster->linkCountPerNode_, &info_loop); + if (rankId*as_cluster->linkCountPerNode_ >= static_cast(as_cluster->privateLinks_.size())){ + s_surf_parsing_link_up_down_t dummy; + dummy.linkUp = nullptr; + dummy.linkDown = nullptr; + as_cluster->privateLinks_.resize(rankId*as_cluster->linkCountPerNode_,dummy); + } + as_cluster->privateLinks_.insert(as_cluster->privateLinks_.begin() + rankId*as_cluster->linkCountPerNode_, + info_loop); } //add a limiter link (shared link to account for maximal bandwidth of the node) @@ -347,7 +356,8 @@ void sg_platf_new_cluster(sg_platf_cluster_cbarg_t cluster) sg_platf_new_link(&link); info_lim.linkUp = info_lim.linkDown = Link::byName(tmp_link); free(tmp_link); - xbt_dynar_set(current_as->privateLinks_, rankId * current_as->linkCountPerNode_ + current_as->hasLoopback_ , &info_lim); + current_as->privateLinks_.insert(current_as->privateLinks_.begin() + rankId * current_as->linkCountPerNode_ + + current_as->hasLoopback_ , info_lim); } //call the cluster function that adds the others links @@ -903,10 +913,15 @@ void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t hostlink) // If dynar is is greater than netcard id and if the host_link is already defined auto as_cluster = static_cast(current_routing); - if((int)xbt_dynar_length(as_cluster->privateLinks_) > netcard->id() && - xbt_dynar_get_as(as_cluster->privateLinks_, netcard->id(), void*)) - surf_parse_error("Host_link for '%s' is already defined!",hostlink->id); - + if(static_cast(as_cluster->privateLinks_.size()) > netcard->id()){ + if (as_cluster->privateLinks_.at(netcard->id()).linkUp != nullptr) + surf_parse_error("Host_link for '%s' is already defined!",hostlink->id); + } else { + s_surf_parsing_link_up_down_t dummy; + dummy.linkUp = nullptr; + dummy.linkDown = nullptr; + as_cluster->privateLinks_.resize(netcard->id(), dummy); + } XBT_DEBUG("Push Host_link for host '%s' to position %d", netcard->name(), netcard->id()); - xbt_dynar_set_as(as_cluster->privateLinks_, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down); + as_cluster->privateLinks_.insert(as_cluster->privateLinks_.begin() + netcard->id(), link_up_down); } -- 2.20.1