From 2fdfd29d8bd702dc10068f8f6ead958115a52e5a Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Fri, 25 Mar 2022 21:23:13 +0100 Subject: [PATCH] Expose signals Activity::on_suspend and Activity::on_resume in s4u Earlier, they were only accessible from ActivityImpl --- ChangeLog | 3 ++- docs/source/app_s4u.rst | 11 +++++++++++ include/simgrid/s4u/Activity.hpp | 11 +++++++++-- src/kernel/activity/ActivityImpl.cpp | 7 +++---- src/kernel/activity/ActivityImpl.hpp | 3 --- src/kernel/resource/VirtualMachineImpl.cpp | 12 ++++++------ src/s4u/s4u_Activity.cpp | 4 +++- 7 files changed, 34 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4bd23d27d5..1b7eed286a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,8 @@ SimGrid (3.31.1) NOT RELEASED YET (v3.32 expected June 21. 2022, 09:13 UTC) ---------------------------------------------------------------------------- S4U: - - kill Comm::on_completion that was not working anyway. + - kill signal Comm::on_completion that was not working anyway. + - Expose signals Activity::on_suspend and Activity::on_resume SimGrid (3.31) March 22. 2022. diff --git a/docs/source/app_s4u.rst b/docs/source/app_s4u.rst index 2047854710..ededc62a7c 100644 --- a/docs/source/app_s4u.rst +++ b/docs/source/app_s4u.rst @@ -2123,6 +2123,17 @@ Suspending and resuming an activity .. doxygenfunction:: simgrid::s4u::Activity::resume .. doxygenfunction:: simgrid::s4u::Activity::is_suspended +Signals +------- + +.. tabs:: + + .. group-tab:: C++ + + .. doxygenfunction:: simgrid::s4u::Activity::on_completion_cb + .. doxygenfunction:: simgrid::s4u::Activity::on_suspend_cb + .. doxygenfunction:: simgrid::s4u::Activity::on_resume_cb + .. _API_s4u_Comm: ============= diff --git a/include/simgrid/s4u/Activity.hpp b/include/simgrid/s4u/Activity.hpp index d1d8ab4e1f..353fcdbaa0 100644 --- a/include/simgrid/s4u/Activity.hpp +++ b/include/simgrid/s4u/Activity.hpp @@ -32,10 +32,11 @@ namespace s4u { * That is, activities are all the things that do take time to the actor in the simulated world. */ class XBT_PUBLIC Activity : public xbt::Extendable { +#ifndef DOXYGEN friend Comm; friend Exec; friend Io; -#ifndef DOXYGEN + friend kernel::activity::ActivityImpl; friend std::vector create_DAG_from_dot(const std::string& filename); friend std::vector create_DAG_from_DAX(const std::string& filename); #endif @@ -97,7 +98,9 @@ protected: private: static xbt::signal on_veto; - static xbt::signal on_completion; + static xbt::signal on_completion; + static xbt::signal on_suspended; + static xbt::signal on_resumed; public: /*! Add a callback fired each time that the activity fails to start because of a veto (e.g., unsolved dependency or no @@ -105,6 +108,10 @@ public: static void on_veto_cb(const std::function& cb) { on_veto.connect(cb); } /*! Add a callback fired when the activity completes (either normally, cancelled or failed) */ static void on_completion_cb(const std::function& cb) { on_completion.connect(cb); } + /*! Add a callback fired when the activity is suspended */ + static void on_suspended_cb(const std::function& cb) { on_suspended.connect(cb); } + /*! Add a callback fired when the activity is resumed after being suspended */ + static void on_resumed_cb(const std::function& cb) { on_resumed.connect(cb); } void vetoable_start() { diff --git a/src/kernel/activity/ActivityImpl.cpp b/src/kernel/activity/ActivityImpl.cpp index dbf06bc5e3..3c47e41553 100644 --- a/src/kernel/activity/ActivityImpl.cpp +++ b/src/kernel/activity/ActivityImpl.cpp @@ -4,6 +4,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include +#include #include #include "src/kernel/activity/ActivityImpl.hpp" @@ -180,7 +181,7 @@ void ActivityImpl::suspend() return; XBT_VERB("This activity is suspended (remain: %f)", surf_action_->get_remains()); surf_action_->suspend(); - on_suspended(*this); + s4u::Activity::on_suspended(*get_iface()); } void ActivityImpl::resume() @@ -189,7 +190,7 @@ void ActivityImpl::resume() return; XBT_VERB("This activity is resumed (remain: %f)", surf_action_->get_remains()); surf_action_->resume(); - on_resumed(*this); + s4u::Activity::on_resumed(*get_iface()); } void ActivityImpl::cancel() @@ -236,8 +237,6 @@ void intrusive_ptr_release(ActivityImpl* activity) delete activity; } } -xbt::signal ActivityImpl::on_resumed; -xbt::signal ActivityImpl::on_suspended; } } } // namespace simgrid::kernel::activity:: diff --git a/src/kernel/activity/ActivityImpl.hpp b/src/kernel/activity/ActivityImpl.hpp index 68126bca04..5a5404e487 100644 --- a/src/kernel/activity/ActivityImpl.hpp +++ b/src/kernel/activity/ActivityImpl.hpp @@ -91,9 +91,6 @@ public: friend XBT_PUBLIC void intrusive_ptr_add_ref(ActivityImpl* activity); friend XBT_PUBLIC void intrusive_ptr_release(ActivityImpl* activity); int get_refcount() const { return static_cast(refcount_); } // For debugging purpose - - static xbt::signal on_suspended; - static xbt::signal on_resumed; }; /* This class exists to allow chained setters as in exec->set_name()->set_priority()->set_blah() diff --git a/src/kernel/resource/VirtualMachineImpl.cpp b/src/kernel/resource/VirtualMachineImpl.cpp index e741ba131d..2c36cac837 100644 --- a/src/kernel/resource/VirtualMachineImpl.cpp +++ b/src/kernel/resource/VirtualMachineImpl.cpp @@ -92,13 +92,13 @@ static void remove_active_exec(s4u::Activity const& task) } } -static s4u::VirtualMachine* get_vm_from_activity(kernel::activity::ActivityImpl const& act) +static s4u::VirtualMachine* get_vm_from_activity(s4u::Activity const& act) { - auto* exec = dynamic_cast(&act); + auto* exec = dynamic_cast(act.get_impl()); return exec != nullptr ? dynamic_cast(exec->get_host()) : nullptr; } -static void add_active_activity(kernel::activity::ActivityImpl const& act) +static void add_active_activity(s4u::Activity const& act) { const s4u::VirtualMachine* vm = get_vm_from_activity(act); if (vm != nullptr) { @@ -108,7 +108,7 @@ static void add_active_activity(kernel::activity::ActivityImpl const& act) } } -static void remove_active_activity(kernel::activity::ActivityImpl const& act) +static void remove_active_activity(s4u::Activity const& act) { const s4u::VirtualMachine* vm = get_vm_from_activity(act); if (vm != nullptr) { @@ -123,8 +123,8 @@ VMModel::VMModel(const std::string& name) : HostModel(name) s4u::Host::on_state_change_cb(host_state_change); s4u::Exec::on_start_cb(add_active_exec); s4u::Activity::on_completion_cb(remove_active_exec); - activity::ActivityImpl::on_resumed.connect(add_active_activity); - activity::ActivityImpl::on_suspended.connect(remove_active_activity); + s4u::Activity::on_resumed_cb(add_active_activity); + s4u::Activity::on_suspended_cb(remove_active_activity); } double VMModel::next_occurring_event(double now) diff --git a/src/s4u/s4u_Activity.cpp b/src/s4u/s4u_Activity.cpp index dcc650de45..6032b0d08a 100644 --- a/src/s4u/s4u_Activity.cpp +++ b/src/s4u/s4u_Activity.cpp @@ -25,7 +25,9 @@ template class xbt::Extendable; namespace s4u { xbt::signal Activity::on_veto; -xbt::signal Activity::on_completion; +xbt::signal Activity::on_completion; +xbt::signal Activity::on_suspended; +xbt::signal Activity::on_resumed; std::set* Activity::vetoed_activities_ = nullptr; -- 2.20.1