Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'model_types_rework_part1' into 'master'
[simgrid.git] / src / kernel / routing / NetZoneImpl.cpp
index 81a6383..4dd41be 100644 (file)
@@ -1,4 +1,4 @@
-/* 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. */
@@ -7,6 +7,9 @@
 #include "simgrid/kernel/routing/NetPoint.hpp"
 #include "simgrid/s4u/Engine.hpp"
 #include "simgrid/s4u/Host.hpp"
+#include "src/kernel/EngineImpl.hpp"
+#include "src/kernel/resource/DiskImpl.hpp"
+#include "src/surf/HostImpl.hpp"
 #include "src/surf/cpu_interface.hpp"
 #include "src/surf/network_interface.hpp"
 #include "src/surf/xml/platf_private.hpp"
@@ -18,13 +21,11 @@ namespace simgrid {
 namespace kernel {
 namespace routing {
 
-NetZoneImpl::NetZoneImpl(NetZoneImpl* father, const std::string& name, resource::NetworkModel* network_model)
-    : piface_(this), father_(father), name_(name), network_model_(network_model)
+NetZoneImpl::NetZoneImpl(const std::string& name) : piface_(this), name_(name)
 {
   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);
   XBT_DEBUG("NetZone '%s' created with the id '%u'", get_cname(), netpoint_->id());
 }
 
@@ -44,7 +45,7 @@ NetZoneImpl::~NetZoneImpl()
  * Only the hosts that are directly contained in this NetZone are retrieved,
  * not the ones contained in sub-netzones.
  */
-std::vector<s4u::Host*> NetZoneImpl::get_all_hosts()
+std::vector<s4u::Host*> NetZoneImpl::get_all_hosts() const
 {
   std::vector<s4u::Host*> res;
   for (auto const& card : get_vertices()) {
@@ -54,7 +55,7 @@ std::vector<s4u::Host*> NetZoneImpl::get_all_hosts()
   }
   return res;
 }
-int NetZoneImpl::get_host_count()
+int NetZoneImpl::get_host_count() const
 {
   int count = 0;
   for (auto const& card : get_vertices()) {
@@ -65,22 +66,31 @@ int NetZoneImpl::get_host_count()
   return count;
 }
 
-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)
+s4u::Disk* NetZoneImpl::create_disk(const std::string& name, double read_bandwidth, double write_bandwidth)
 {
-  s4u::Host* res = new s4u::Host(name);
+  auto* l = disk_model_->create_disk(name, read_bandwidth, write_bandwidth);
 
-  if (hierarchy_ == RoutingMode::unset)
-    hierarchy_ = RoutingMode::base;
+  return l->get_iface();
+}
 
-  res->set_netpoint(new NetPoint(name, NetPoint::Type::Host, this));
+s4u::Link* NetZoneImpl::create_link(const std::string& name, const std::vector<double>& bandwidths,
+                                    s4u::Link::SharingPolicy policy)
+{
+  auto* l = network_model_->create_link(name, bandwidths, policy);
 
-  surf_cpu_model_pm->create_cpu(res, speed_per_pstate, coreAmount);
+  return l->get_iface();
+}
 
-  if (props != nullptr)
-    res->set_properties(*props);
+s4u::Host* NetZoneImpl::create_host(const std::string& name, const std::vector<double>& speed_per_pstate,
+                                    int core_amount)
+{
+  if (hierarchy_ == RoutingMode::unset)
+    hierarchy_ = RoutingMode::base;
+
+  auto* res = new s4u::Host(name);
+  res->set_netpoint((new NetPoint(name, NetPoint::Type::Host))->set_englobing_zone(this));
 
-  s4u::Host::on_creation(*res); // notify the signal
+  cpu_model_pm_->create_cpu(res, speed_per_pstate)->set_core_count(core_amount)->seal();
 
   return res;
 }
@@ -118,7 +128,7 @@ void NetZoneImpl::add_bypass_route(NetPoint* src, NetPoint* dst, NetPoint* gw_sr
   }
 
   /* 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);
 
@@ -202,13 +212,13 @@ static void find_common_ancestors(NetPoint* src, NetPoint* dst,
   NetZoneImpl* current = src->get_englobing_zone();
   while (current != nullptr) {
     path_src.push_back(current);
-    current = static_cast<NetZoneImpl*>(current->get_father());
+    current = current->get_father();
   }
   std::vector<NetZoneImpl*> path_dst;
   current = dst->get_englobing_zone();
   while (current != nullptr) {
     path_dst.push_back(current);
-    current = static_cast<NetZoneImpl*>(current->get_father());
+    current = current->get_father();
   }
 
   /* (3) find the common father.
@@ -265,14 +275,14 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
   std::vector<NetZoneImpl*> path_src;
   NetZoneImpl* current = src->get_englobing_zone();
   while (current != nullptr) {
-    path_src.push_back(static_cast<NetZoneImpl*>(current));
+    path_src.push_back(current);
     current = current->father_;
   }
 
   std::vector<NetZoneImpl*> path_dst;
   current = dst->get_englobing_zone();
   while (current != nullptr) {
-    path_dst.push_back(static_cast<NetZoneImpl*>(current));
+    path_dst.push_back(current);
     current = current->father_;
   }
 
@@ -291,35 +301,29 @@ bool NetZoneImpl::get_bypass_route(NetPoint* src, NetPoint* dst,
   /* (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_};
+        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) {
-        key = {path_src.at(max)->netpoint_, path_dst.at(i)->netpoint_};
+      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) {
-      key = {path_src.at(max)->netpoint_, path_dst.at(max)->netpoint_};
+    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;
       }
     }
   }
@@ -352,9 +356,9 @@ void NetZoneImpl::get_global_route(NetPoint* src, NetPoint* dst,
   XBT_DEBUG("Resolve route from '%s' to '%s'", src->get_cname(), dst->get_cname());
 
   /* Find how src and dst are interconnected */
-  NetZoneImpl *common_ancestor;
-  NetZoneImpl *src_ancestor;
-  NetZoneImpl *dst_ancestor;
+  NetZoneImplcommon_ancestor;
+  NetZoneImplsrc_ancestor;
+  NetZoneImpldst_ancestor;
   find_common_ancestors(src, dst, &common_ancestor, &src_ancestor, &dst_ancestor);
   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());
@@ -374,7 +378,7 @@ void NetZoneImpl::get_global_route(NetPoint* src, NetPoint* dst,
   /* 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 */
@@ -387,6 +391,50 @@ void NetZoneImpl::get_global_route(NetPoint* src, NetPoint* dst,
   if (route.gw_dst != dst)
     get_global_route(route.gw_dst, dst, links, latency);
 }
+
+void NetZoneImpl::seal()
+{
+  do_seal(); // derived class' specific sealing procedure
+  sealed_ = true;
+}
+
+void NetZoneImpl::set_parent(NetZoneImpl* parent)
+{
+  xbt_assert(sealed_ == false, "Impossible to set parent to an already sealed NetZone(%s)", this->get_cname());
+  father_ = parent;
+  netpoint_->set_englobing_zone(father_);
+}
+
+void NetZoneImpl::set_network_model(std::shared_ptr<resource::NetworkModel> netmodel)
+{
+  xbt_assert(sealed_ == false, "Impossible to set network model to an already sealed NetZone(%s)", this->get_cname());
+  network_model_ = std::move(netmodel);
+}
+
+void NetZoneImpl::set_cpu_vm_model(std::shared_ptr<resource::CpuModel> cpu_model)
+{
+  xbt_assert(sealed_ == false, "Impossible to set CPU model to an already sealed NetZone(%s)", this->get_cname());
+  cpu_model_vm_ = std::move(cpu_model);
+}
+
+void NetZoneImpl::set_cpu_pm_model(std::shared_ptr<resource::CpuModel> cpu_model)
+{
+  xbt_assert(sealed_ == false, "Impossible to set CPU model to an already sealed NetZone(%s)", this->get_cname());
+  cpu_model_pm_ = std::move(cpu_model);
+}
+
+void NetZoneImpl::set_disk_model(std::shared_ptr<resource::DiskModel> disk_model)
+{
+  xbt_assert(sealed_ == false, "Impossible to set disk model to an already sealed NetZone(%s)", this->get_cname());
+  disk_model_ = std::move(disk_model);
+}
+
+void NetZoneImpl::set_host_model(std::shared_ptr<surf::HostModel> host_model)
+{
+  xbt_assert(sealed_ == false, "Impossible to set host model to an already sealed NetZone(%s)", this->get_cname());
+  host_model_ = std::move(host_model);
+}
+
 } // namespace routing
 } // namespace kernel
 } // namespace simgrid