Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
inline SIMIX_host_off into s4u::Host->turnOff()
[simgrid.git] / src / s4u / s4u_Host.cpp
index bd963f4..9aa141c 100644 (file)
@@ -23,10 +23,10 @@ template class Extendable<simgrid::s4u::Host>;
 
 namespace s4u {
 
-simgrid::xbt::signal<void(Host&)> Host::onCreation;
-simgrid::xbt::signal<void(Host&)> Host::onDestruction;
-simgrid::xbt::signal<void(Host&)> Host::onStateChange;
-simgrid::xbt::signal<void(Host&)> Host::onSpeedChange;
+simgrid::xbt::signal<void(Host&)> Host::on_creation;
+simgrid::xbt::signal<void(Host&)> Host::on_destruction;
+simgrid::xbt::signal<void(Host&)> Host::on_state_change;
+simgrid::xbt::signal<void(Host&)> Host::on_speed_change;
 
 Host::Host(const char* name) : name_(name)
 {
@@ -43,7 +43,7 @@ Host::~Host()
   if (pimpl_netpoint != nullptr) // not removed yet by a children class
     simgrid::s4u::Engine::get_instance()->netpoint_unregister(pimpl_netpoint);
   delete pimpl_cpu;
-  delete mounts;
+  delete mounts_;
 }
 
 /** @brief Fire the required callbacks and destroy the object
@@ -58,7 +58,7 @@ void Host::destroy()
 {
   if (not currentlyDestroying_) {
     currentlyDestroying_ = true;
-    onDestruction(*this);
+    on_destruction(*this);
     Engine::get_instance()->host_unregister(std::string(name_));
     delete this;
   }
@@ -95,18 +95,33 @@ void Host::turnOn()
     simgrid::simix::simcall([this] {
       this->extension<simgrid::simix::Host>()->turnOn();
       this->pimpl_cpu->turn_on();
-      onStateChange(*this);
+      on_state_change(*this);
     });
   }
 }
 
+/** @brief Stop the host if it is on */
 void Host::turnOff()
 {
   if (isOn()) {
     smx_actor_t self = SIMIX_process_self();
     simgrid::simix::simcall([this, self] {
-      SIMIX_host_off(this, self);
-      onStateChange(*this);
+      simgrid::simix::Host* host = this->extension<simgrid::simix::Host>();
+
+      xbt_assert((host != nullptr), "Invalid parameters");
+
+      this->pimpl_cpu->turn_off();
+
+      /* Clean Simulator data */
+      if (not host->process_list.empty()) {
+        for (auto& process : host->process_list) {
+          SIMIX_process_kill(&process, self);
+          XBT_DEBUG("Killing %s@%s on behalf of %s which turned off that host.", process.get_cname(),
+                    process.host->get_cname(), self->get_cname());
+        }
+      }
+
+      on_state_change(*this);
     });
   }
 }
@@ -207,6 +222,10 @@ double Host::getSpeed()
 {
   return pimpl_cpu->getSpeed(1.0);
 }
+double Host::get_available_speed()
+{
+  return pimpl_cpu->get_available_speed();
+}
 
 /** @brief Returns the number of core of the processor. */
 int Host::getCoreCount()
@@ -245,13 +264,13 @@ void Host::getAttachedStorages(std::vector<const char*>* storages)
 
 std::unordered_map<std::string, Storage*> const& Host::getMountedStorages()
 {
-  if (mounts == nullptr) {
-    mounts = new std::unordered_map<std::string, Storage*>();
+  if (mounts_ == nullptr) {
+    mounts_ = new std::unordered_map<std::string, Storage*>();
     for (auto const& m : this->pimpl_->storage_) {
-      mounts->insert({m.first, &m.second->piface_});
+      mounts_->insert({m.first, &m.second->piface_});
     }
   }
-  return *mounts;
+  return *mounts_;
 }
 
 void Host::execute(double flops)
@@ -409,7 +428,7 @@ int sg_host_core_count(sg_host_t host)
 
 double sg_host_get_available_speed(sg_host_t host)
 {
-  return host->pimpl_cpu->get_available_speed();
+  return host->get_available_speed();
 }
 
 /** @brief Returns the number of power states for a host.
@@ -557,7 +576,7 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to)
   std::vector<simgrid::s4u::Link*> vlinks;
   from->routeTo(to, vlinks, nullptr);
   for (auto const& link : vlinks) {
-    double bandwidth = link->bandwidth();
+    double bandwidth = link->get_bandwidth();
     if (bandwidth < min_bandwidth || min_bandwidth < 0.0)
       min_bandwidth = bandwidth;
   }