-/* Copyright (c) 2006-2020. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2006-2021. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
xbt_assert(nullptr == s4u::Engine::get_instance()->netpoint_by_name_or_null(get_name()),
"Refusing to create a second NetZone called '%s'.", get_cname());
- netpoint_ = new NetPoint(name_, NetPoint::Type::NetZone, father);
+ netpoint_ = new NetPoint(name_, NetPoint::Type::NetZone, father_);
XBT_DEBUG("NetZone '%s' created with the id '%u'", get_cname(), netpoint_->id());
}
return count;
}
+s4u::Link* NetZoneImpl::create_link(const std::string& name, const std::vector<double>& bandwidths, double latency,
+ s4u::Link::SharingPolicy policy,
+ const std::unordered_map<std::string, std::string>* props)
+{
+ static double last_warned_latency = sg_surf_precision;
+ if (latency != 0.0 && latency < last_warned_latency) {
+ XBT_WARN("Latency for link %s is smaller than surf/precision (%g < %g)."
+ " For more accuracy, consider setting \"--cfg=surf/precision:%g\".",
+ name.c_str(), latency, sg_surf_precision, latency);
+ last_warned_latency = latency;
+ }
+
+ auto* l = surf_network_model->create_link(name, bandwidths, latency, policy);
+
+ if (props)
+ l->set_properties(*props);
+
+ return l->get_iface();
+}
s4u::Host* NetZoneImpl::create_host(const std::string& name, const std::vector<double>& speed_per_pstate,
- int coreAmount, const std::map<std::string, std::string>* props)
+ int coreAmount, const std::unordered_map<std::string, std::string>* props)
{
- s4u::Host* res = new s4u::Host(name);
+ auto* res = new s4u::Host(name);
if (hierarchy_ == RoutingMode::unset)
hierarchy_ = RoutingMode::base;
}
/* Build a copy that will be stored in the dict */
- BypassRoute* newRoute = new BypassRoute(gw_src, gw_dst);
+ auto* newRoute = new BypassRoute(gw_src, gw_dst);
for (auto const& link : link_list)
newRoute->links.push_back(link);
/* (3) Search for a bypass making the path up to the ancestor useless */
const BypassRoute* bypassedRoute = nullptr;
std::pair<kernel::routing::NetPoint*, kernel::routing::NetPoint*> key;
- for (int max = 0; max <= max_index; max++) {
- for (int i = 0; i < max; i++) {
+ for (int max = 0; max <= max_index && not bypassedRoute; max++) {
+ for (int i = 0; i < max && not bypassedRoute; i++) {
if (i <= max_index_src && max <= max_index_dst) {
key = {path_src.at(i)->netpoint_, path_dst.at(max)->netpoint_};
auto bpr = bypass_routes_.find(key);
if (bpr != bypass_routes_.end()) {
bypassedRoute = bpr->second;
- break;
}
}
- if (max <= max_index_src && i <= max_index_dst) {
+ if (not bypassedRoute && max <= max_index_src && i <= max_index_dst) {
key = {path_src.at(max)->netpoint_, path_dst.at(i)->netpoint_};
auto bpr = bypass_routes_.find(key);
if (bpr != bypass_routes_.end()) {
bypassedRoute = bpr->second;
- break;
}
}
}
- if (bypassedRoute)
- break;
-
- if (max <= max_index_src && max <= max_index_dst) {
+ if (not bypassedRoute && max <= max_index_src && max <= max_index_dst) {
key = {path_src.at(max)->netpoint_, path_dst.at(max)->netpoint_};
auto bpr = bypass_routes_.find(key);
if (bpr != bypass_routes_.end()) {
bypassedRoute = bpr->second;
- break;
}
}
}
/* Not in the same netzone, no bypass. We'll have to find our path between the netzones recursively */
common_ancestor->get_local_route(src_ancestor->netpoint_, dst_ancestor->netpoint_, &route, latency);
- xbt_assert((route.gw_src != nullptr) && (route.gw_dst != nullptr), "bad gateways for route from \"%s\" to \"%s\"",
+ xbt_assert((route.gw_src != nullptr) && (route.gw_dst != nullptr), "Bad gateways for route from '%s' to '%s'.",
src->get_cname(), dst->get_cname());
/* If source gateway is not our source, we have to recursively find our way up to this point */