X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/371d168e21b83e2364c2ac2dbff3847588769c2b..6f52065daaea5d8b482ac4478be2739c5f11691b:/src/plugins/host_energy.cpp diff --git a/src/plugins/host_energy.cpp b/src/plugins/host_energy.cpp index 36e10449cf..d2f5dc8c93 100644 --- a/src/plugins/host_energy.cpp +++ b/src/plugins/host_energy.cpp @@ -11,6 +11,7 @@ #include #include +#include "src/kernel/activity/ActivityImpl.hpp" #include "src/kernel/resource/CpuImpl.hpp" #include "src/simgrid/module.hpp" @@ -438,14 +439,13 @@ static void on_action_state_change(simgrid::kernel::resource::CpuAction const& a /* This callback is fired either when the host changes its state (on/off) ("onStateChange") or its speed * (because the user changed the pstate, or because of external trace events) ("onSpeedChange") */ -static void on_host_change(simgrid::s4u::Host const& host) +static void on_host_change(simgrid::s4u::Host const& h) { - if (dynamic_cast(&host)) // Ignore virtual machines - return; - - auto* host_energy = host.extension(); + auto* host = &h; + if (const auto* vm = dynamic_cast(host)) // Take the PM of virtual machines + host = vm->get_pm(); - host_energy->update(); + host->extension()->update(); } static void on_host_destruction(simgrid::s4u::Host const& host) @@ -473,6 +473,13 @@ static void on_simulation_end() used_hosts_energy, total_energy - used_hosts_energy); } +static void on_activity_suspend_resume(simgrid::s4u::Activity const& activity) +{ + if (auto* action = dynamic_cast(activity.get_impl()->model_action_); + action != nullptr) + on_action_state_change(*action, /*ignored*/ action->get_state()); +} + /* **************************** Public interface *************************** */ /** @ingroup plugin_host_energy @@ -487,20 +494,24 @@ void sg_host_energy_plugin_init() HostEnergy::EXTENSION_ID = simgrid::s4u::Host::extension_create(); simgrid::s4u::Host::on_creation_cb(&on_creation); - simgrid::s4u::Host::on_state_change_cb(&on_host_change); + simgrid::s4u::Host::on_onoff_cb(&on_host_change); simgrid::s4u::Host::on_speed_change_cb(&on_host_change); simgrid::s4u::Host::on_destruction_cb(&on_host_destruction); + simgrid::s4u::Host::on_exec_state_change_cb(&on_action_state_change); + simgrid::s4u::VirtualMachine::on_suspend_cb(&on_host_change); + simgrid::s4u::VirtualMachine::on_resume_cb(&on_host_change); + simgrid::s4u::Exec::on_suspend_cb(on_activity_suspend_resume); + simgrid::s4u::Exec::on_resume_cb(on_activity_suspend_resume); simgrid::s4u::Engine::on_simulation_end_cb(&on_simulation_end); - simgrid::kernel::resource::CpuAction::on_state_change.connect(&on_action_state_change); // We may only have one actor on a node. If that actor executes something like // compute -> recv -> compute - // the recv operation will not trigger a "CpuAction::on_state_change". This means + // the recv operation will not trigger a "Host::on_exec_state_change_cb". This means // that the next trigger would be the 2nd compute, hence ignoring the idle time // during the recv call. By updating at the beginning of a compute, we can // fix that. (If the cpu is not idle, this is not required.) simgrid::s4u::Exec::on_start_cb([](simgrid::s4u::Exec const& activity) { if (activity.get_host_number() == 1) { // We only run on one host - simgrid::s4u::Host* host = activity.get_host(); + simgrid::s4u::Host* host = activity.get_host(); if (const auto* vm = dynamic_cast(host)) host = vm->get_pm(); xbt_assert(host != nullptr);