AsCluster::AsCluster(const char*name)
: AsImpl(name)
{}
+ AsCluster::~AsCluster()
+ {
+ xbt_dynar_free(&upDownLinks_);
+ }
void AsCluster::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
{
if (! src->isRouter()) { // No specific link for router
if((src->id() == dst->id()) && has_loopback_ ){
- info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
route->link_list->push_back(info.link_up);
if (lat)
*lat += info.link_up->getLatency();
if (has_limiter_){ // limiter for sender
- info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
route->link_list->push_back((Link*)info.link_up);
}
- info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
if (info.link_up) { // link up
route->link_list->push_back(info.link_up);
if (lat)
}
if (! dst->isRouter()) { // No specific link for router
- info = xbt_dynar_get_as(upDownLinks, dst->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, dst->id() * nb_links_per_node_ + has_loopback_ + has_limiter_, s_surf_parsing_link_up_down_t);
if (info.link_down) { // link down
route->link_list->push_back(info.link_down);
*lat += info.link_down->getLatency();
}
if (has_limiter_){ // limiter for receiver
- info = xbt_dynar_get_as(upDownLinks, dst->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, dst->id() * nb_links_per_node_ + has_loopback_, s_surf_parsing_link_up_down_t);
route->link_list->push_back(info.link_up);
}
}
if (! src->isRouter()) {
previous = new_xbt_graph_node(graph, src->name(), nodes);
- info = xbt_dynar_get_as(upDownLinks, src->id(), s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, src->id(), s_surf_parsing_link_up_down_t);
if (info.link_up) { // link up
info.link_up = sg_link_by_name(link_id);
info.link_down = info.link_up;
}
- xbt_dynar_set(upDownLinks, position, &info);
+ xbt_dynar_set(upDownLinks_, position, &info);
xbt_free(link_id);
}
class XBT_PRIVATE AsCluster: public AsImpl {
public:
AsCluster(const char*name);
+ ~AsCluster();
virtual void getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t into, double *latency) override;
void getGraph(xbt_graph_t graph, xbt_dict_t nodes, xbt_dict_t edges) override;
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 upDownLinks_ = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
+
Link* backbone_ = nullptr;
void *loopback_ = nullptr;
NetCard *router_ = nullptr;
* note that position rankId*(xbt_dynar_length(dimensions)+has_loopack?+has_limiter?)
* holds the link "rankId->rankId"
*/
- xbt_dynar_set(upDownLinks, position + j, &info);
+ xbt_dynar_set(upDownLinks_, position + j, &info);
dim_product *= current_dimension;
xbt_free(link_id);
}
return;
if ((src->id() == dst->id()) && has_loopback_) {
- s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(upDownLinks, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
+ s_surf_parsing_link_up_down_t info = xbt_dynar_get_as(upDownLinks_, src->id() * nb_links_per_node_, s_surf_parsing_link_up_down_t);
route->link_list->push_back(info.link_up);
if (lat)
s_surf_parsing_link_up_down_t info;
if (has_limiter_) { // limiter for sender
- info = xbt_dynar_get_as(upDownLinks, nodeOffset + has_loopback_, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, nodeOffset + has_loopback_, s_surf_parsing_link_up_down_t);
route->link_list->push_back(info.link_up);
}
- info = xbt_dynar_get_as(upDownLinks, linkOffset, s_surf_parsing_link_up_down_t);
+ info = xbt_dynar_get_as(upDownLinks_, linkOffset, s_surf_parsing_link_up_down_t);
if (use_lnk_up == false) {
route->link_list->push_back(info.link_down);
}
AsImpl::~AsImpl()
{
- xbt_dynar_free(&upDownLinks);
delete netcard_;
}
};
/* FIXME: protect the following fields once the construction madness is sorted out */
RoutingMode hierarchy_ = RoutingMode::unset;
- xbt_dynar_t upDownLinks = xbt_dynar_new(sizeof(s_surf_parsing_link_up_down_t),NULL);
surf::NetCard *netcard_ = nullptr; // Our representative in the father AS
};
namespace simgrid {
namespace surf {
AsVivaldi::AsVivaldi(const char *name)
- : AsRoutedGraph(name)
+ : AsCluster(name)
{}
void AsVivaldi::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat)
if(src->isHost()){
tmp_src_name = HOST_PEER(src->name());
- if ((int)xbt_dynar_length(upDownLinks)>src->id()) {
- info = xbt_dynar_get_as(upDownLinks, src->id(), s_surf_parsing_link_up_down_t);
+ if ((int)xbt_dynar_length(upDownLinks_)>src->id()) {
+ info = xbt_dynar_get_as(upDownLinks_, src->id(), s_surf_parsing_link_up_down_t);
if(info.link_up) { // link up
route->link_list->push_back(info.link_up);
if (lat)
if(dst->isHost()){
tmp_dst_name = HOST_PEER(dst->name());
- if ((int)xbt_dynar_length(upDownLinks)>dst->id()) {
- info = xbt_dynar_get_as(upDownLinks, dst->id(), s_surf_parsing_link_up_down_t);
+ if ((int)xbt_dynar_length(upDownLinks_)>dst->id()) {
+ info = xbt_dynar_get_as(upDownLinks_, dst->id(), s_surf_parsing_link_up_down_t);
if(info.link_down) { // link down
route->link_list->push_back(info.link_down);
if (lat)
#ifndef SURF_ROUTING_VIVALDI_HPP_
#define SURF_ROUTING_VIVALDI_HPP_
-#include "src/surf/AsRoutedGraph.hpp"
+#include "src/surf/AsCluster.hpp"
namespace simgrid {
namespace surf {
-class XBT_PRIVATE AsVivaldi: public AsRoutedGraph {
+/* This derivates from cluster because each host has a private link */
+class XBT_PRIVATE AsVivaldi: public AsCluster {
public:
AsVivaldi(const char *name);
~AsVivaldi() {};
info_loop.link_up = Link::byName(tmp_link);
info_loop.link_down = info_loop.link_up;
free(tmp_link);
- xbt_dynar_set(current_routing->upDownLinks, rankId*(static_cast<AsCluster*>(current_routing))->nb_links_per_node_, &info_loop);
+ auto as_cluster = static_cast<AsCluster*>(current_routing);
+ xbt_dynar_set(as_cluster->upDownLinks_, rankId*as_cluster->nb_links_per_node_, &info_loop);
}
//add a limiter link (shared link to account for maximal bandwidth of the node)
info_lim.link_down = info_lim.link_up;
free(tmp_link);
auto as_cluster = static_cast<AsCluster*>(current_routing);
- xbt_dynar_set(current_routing->upDownLinks, rankId*(as_cluster)->nb_links_per_node_ + as_cluster->has_loopback_ , &info_lim);
+ xbt_dynar_set(as_cluster->upDownLinks_, rankId*(as_cluster)->nb_links_per_node_ + as_cluster->has_loopback_ , &info_lim);
}
}
/** @brief Add a link connecting an host to the rest of its AS (which must be cluster or vivaldi) */
-void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t netcard_arg)
+void sg_platf_new_hostlink(sg_platf_host_link_cbarg_t hostlink)
{
- simgrid::surf::NetCard *netcard = sg_host_by_name(netcard_arg->id)->pimpl_netcard;
- xbt_assert(netcard, "Host '%s' not found!", netcard_arg->id);
- xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing) ||
- dynamic_cast<simgrid::surf::AsVivaldi*>(current_routing),
- "Only hosts from Cluster and Vivaldi ASes can get a host_link.");
+ simgrid::surf::NetCard *netcard = sg_host_by_name(hostlink->id)->pimpl_netcard;
+ xbt_assert(netcard, "Host '%s' not found!", hostlink->id);
+ xbt_assert(dynamic_cast<simgrid::surf::AsCluster*>(current_routing),
+ "Only hosts from Cluster and Vivaldi ASes can get an host_link.");
s_surf_parsing_link_up_down_t link_up_down;
- link_up_down.link_up = Link::byName(netcard_arg->link_up);
- link_up_down.link_down = Link::byName(netcard_arg->link_down);
+ link_up_down.link_up = Link::byName(hostlink->link_up);
+ link_up_down.link_down = Link::byName(hostlink->link_down);
- xbt_assert(link_up_down.link_up, "Link '%s' not found!",netcard_arg->link_up);
- xbt_assert(link_up_down.link_down, "Link '%s' not found!",netcard_arg->link_down);
+ xbt_assert(link_up_down.link_up, "Link '%s' not found!",hostlink->link_up);
+ xbt_assert(link_up_down.link_down, "Link '%s' not found!",hostlink->link_down);
// If dynar is is greater than netcard id and if the host_link is already defined
- if((int)xbt_dynar_length(current_routing->upDownLinks) > netcard->id() &&
- xbt_dynar_get_as(current_routing->upDownLinks, netcard->id(), void*))
- surf_parse_error("Host_link for '%s' is already defined!",netcard_arg->id);
+ auto as_cluster = static_cast<simgrid::surf::AsCluster*>(current_routing);
+ if((int)xbt_dynar_length(as_cluster->upDownLinks_) > netcard->id() &&
+ xbt_dynar_get_as(as_cluster->upDownLinks_, netcard->id(), void*))
+ surf_parse_error("Host_link for '%s' is already defined!",hostlink->id);
XBT_DEBUG("Push Host_link for host '%s' to position %d", netcard->name(), netcard->id());
- xbt_dynar_set_as(current_routing->upDownLinks, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
+ xbt_dynar_set_as(as_cluster->upDownLinks_, netcard->id(), s_surf_parsing_link_up_down_t, link_up_down);
}