s4u::Host* NetZoneImpl::create_host(const std::string& name, const std::vector<double>& speed_per_pstate)
{
+ xbt_assert(cpu_model_pm_,
+ "Impossible to create host: %s. Invalid CPU model: nullptr. Have you set the parent of this NetZone: %s?",
+ name.c_str(), get_cname());
auto* res = (new surf::HostImpl(name))->get_iface();
res->set_netpoint((new NetPoint(name, NetPoint::Type::Host))->set_englobing_zone(this));
s4u::Link* NetZoneImpl::create_link(const std::string& name, const std::vector<double>& bandwidths)
{
+ xbt_assert(
+ network_model_,
+ "Impossible to create link: %s. Invalid network model: nullptr. Have you set the parent of this NetZone: %s?",
+ name.c_str(), get_cname());
return network_model_->create_link(name, bandwidths)->get_iface();
}
s4u::Disk* NetZoneImpl::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
{
+ xbt_assert(disk_model_,
+ "Impossible to create disk: %s. Invalid disk model: nullptr. Have you set the parent of this NetZone: %s?",
+ name.c_str(), get_cname());
auto* l = disk_model_->create_disk(name, read_bandwidth, write_bandwidth);
return l->get_iface();
* This works because all SimGrid platform have a unique root element (that is the last element of both paths).
*/
NetZoneImpl* father = nullptr; // the netzone we dropped on the previous loop iteration
- while (path_src.size() > 1 && path_dst.size() > 1 &&
- path_src.at(path_src.size() - 1) == path_dst.at(path_dst.size() - 1)) {
- father = path_src.at(path_src.size() - 1);
+ while (path_src.size() > 1 && path_dst.size() > 1 && path_src.back() == path_dst.back()) {
+ father = path_src.back();
path_src.pop_back();
path_dst.pop_back();
}
/* (4) we found the difference at least. Finalize the returned values */
- *src_ancestor = path_src.at(path_src.size() - 1); /* the first different father of src */
- *dst_ancestor = path_dst.at(path_dst.size() - 1); /* the first different father of dst */
+ *src_ancestor = path_src.back(); /* the first different father of src */
+ *dst_ancestor = path_dst.back(); /* the first different father of dst */
if (*src_ancestor == *dst_ancestor) { // src is the ancestor of dst, or the contrary
*common_ancestor = *src_ancestor;
} else {
+ xbt_assert(father != nullptr);
*common_ancestor = father;
}
}
/* PRECONDITION: this is the common ancestor of src and dst */
bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
- /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency)
+ /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
+ std::unordered_set<NetZoneImpl*>& netzones)
{
// If never set a bypass route return nullptr without any further computations
if (bypass_routes_.empty())
}
/* (2) find the common father */
- while (path_src.size() > 1 && path_dst.size() > 1 &&
- path_src.at(path_src.size() - 1) == path_dst.at(path_dst.size() - 1)) {
+ while (path_src.size() > 1 && path_dst.size() > 1 && path_src.back() == path_dst.back()) {
path_src.pop_back();
path_dst.pop_back();
}
"calls to getRoute",
src->get_cname(), dst->get_cname(), bypassedRoute->links.size());
if (src != key.first)
- get_global_route(src, bypassedRoute->gw_src, links, latency);
+ get_global_route_with_netzones(src, bypassedRoute->gw_src, links, latency, netzones);
for (resource::LinkImpl* const& link : bypassedRoute->links) {
links.push_back(link);
if (latency)
*latency += link->get_latency();
}
if (dst != key.second)
- get_global_route(bypassedRoute->gw_dst, dst, links, latency);
+ get_global_route_with_netzones(bypassedRoute->gw_dst, dst, links, latency, netzones);
return true;
}
XBT_DEBUG("No bypass route from '%s' to '%s'.", src->get_cname(), dst->get_cname());
void NetZoneImpl::get_global_route(NetPoint* src, NetPoint* dst,
/* OUT */ std::vector<resource::LinkImpl*>& links, double* latency)
+{
+ std::unordered_set<NetZoneImpl*> netzones;
+ get_global_route_with_netzones(src, dst, links, latency, netzones);
+}
+
+void NetZoneImpl::get_global_route_with_netzones(NetPoint* src, NetPoint* dst,
+ /* OUT */ std::vector<resource::LinkImpl*>& links, double* latency,
+ std::unordered_set<NetZoneImpl*>& netzones)
{
Route route;
XBT_DEBUG("elements_father: common ancestor '%s' src ancestor '%s' dst ancestor '%s'", common_ancestor->get_cname(),
src_ancestor->get_cname(), dst_ancestor->get_cname());
+ netzones.insert(src->get_englobing_zone());
+ netzones.insert(dst->get_englobing_zone());
+ netzones.insert(common_ancestor);
/* Check whether a direct bypass is defined. If so, use it and bail out */
- if (common_ancestor->get_bypass_route(src, dst, links, latency))
+ if (common_ancestor->get_bypass_route(src, dst, links, latency, netzones))
return;
/* If src and dst are in the same netzone, life is good */
}
/* 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'.",
src->get_cname(), dst->get_cname());
/* If source gateway is not our source, we have to recursively find our way up to this point */
if (src != route.gw_src_)
- get_global_route(src, route.gw_src_, links, latency);
+ get_global_route_with_netzones(src, route.gw_src_, links, latency, netzones);
links.insert(links.end(), begin(route.link_list_), end(route.link_list_));
/* If dest gateway is not our destination, we have to recursively find our way from this point */
if (route.gw_dst_ != dst)
- get_global_route(route.gw_dst_, dst, links, latency);
+ get_global_route_with_netzones(route.gw_dst_, dst, links, latency, netzones);
}
void NetZoneImpl::seal()