Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
factor suspend/resume across Activities
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 6 Feb 2019 14:21:14 +0000 (15:21 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Wed, 6 Feb 2019 14:21:14 +0000 (15:21 +0100)
 + specific Activity can override (CommImpl and SynchroRaw do that)
   + current comments are pretty confusing
 + signals are now in ActivityImpl

src/kernel/activity/ActivityImpl.cpp
src/kernel/activity/ActivityImpl.hpp
src/kernel/activity/ExecImpl.cpp
src/kernel/activity/ExecImpl.hpp
src/kernel/activity/IoImpl.cpp
src/kernel/activity/IoImpl.hpp
src/kernel/activity/SleepImpl.cpp
src/kernel/activity/SleepImpl.hpp
src/plugins/vm/VirtualMachineImpl.cpp

index a92efa2..a2cdff3 100644 (file)
@@ -5,11 +5,31 @@
 
 #include "src/kernel/activity/ActivityImpl.hpp"
 
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
+
 namespace simgrid {
 namespace kernel {
 namespace activity {
 
-void simgrid::kernel::activity::ActivityImpl::set_category(std::string category)
+void ActivityImpl::suspend()
+{
+  if (surf_action_ == nullptr)
+    return;
+  XBT_VERB("This activity is suspended (remain: %f)", surf_action_->get_remains());
+  surf_action_->suspend();
+  on_suspended(this);
+}
+
+void ActivityImpl::resume()
+{
+  if (surf_action_ == nullptr)
+    return;
+  XBT_VERB("This activity is resumed (remain: %f)", surf_action_->get_remains());
+  surf_action_->resume();
+  on_resumed(this);
+}
+
+void ActivityImpl::set_category(std::string category)
 {
   if (surf_action_)
     surf_action_->set_category(category);
@@ -28,6 +48,8 @@ void intrusive_ptr_release(simgrid::kernel::activity::ActivityImpl* activity)
     delete activity;
   }
 }
+xbt::signal<void(ActivityImplPtr)> ActivityImpl::on_resumed;
+xbt::signal<void(ActivityImplPtr)> ActivityImpl::on_suspended;
 }
 }
 } // namespace simgrid::kernel::activity::
index 7b8f091..ec860fc 100644 (file)
@@ -30,8 +30,8 @@ public:
   std::list<smx_simcall_t> simcalls_;   /* List of simcalls waiting for this activity */
   resource::Action* surf_action_ = nullptr;
 
-  virtual void suspend() = 0;
-  virtual void resume()  = 0;
+  virtual void suspend();
+  virtual void resume();
   virtual void post()    = 0; // What to do when a simcall terminates
 
   void set_category(std::string category);
@@ -42,6 +42,10 @@ public:
 
 private:
   std::atomic_int_fast32_t refcount_{0};
+
+public:
+  static simgrid::xbt::signal<void(ActivityImplPtr)> on_suspended;
+  static simgrid::xbt::signal<void(ActivityImplPtr)> on_resumed;
 };
 }}} // namespace simgrid::kernel::activity
 
index edf9d2e..d853185 100644 (file)
@@ -51,21 +51,7 @@ void simgrid::kernel::activity::ExecImpl::start(double flops_amount, double prio
   simgrid::kernel::activity::ExecImpl::on_creation(this);
 }
 
-void simgrid::kernel::activity::ExecImpl::suspend()
-{
-  XBT_VERB("This exec is suspended (remain: %f)", surf_action_->get_remains());
-  if (surf_action_ != nullptr)
-    surf_action_->suspend();
-  on_suspended(this);
-}
 
-void simgrid::kernel::activity::ExecImpl::resume()
-{
-  XBT_VERB("This exec is resumed (remain: %f)", surf_action_->get_remains());
-  if (surf_action_ != nullptr)
-    surf_action_->resume();
-  on_resumed(this);
-}
 void simgrid::kernel::activity::ExecImpl::cancel()
 {
   XBT_VERB("This exec %p is canceled", this);
@@ -162,7 +148,5 @@ simgrid::kernel::activity::ExecImpl::migrate(simgrid::s4u::Host* to)
  *************/
 simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr)> simgrid::kernel::activity::ExecImpl::on_creation;
 simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr)> simgrid::kernel::activity::ExecImpl::on_completion;
-simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr)> simgrid::kernel::activity::ExecImpl::on_resumed;
-simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr)> simgrid::kernel::activity::ExecImpl::on_suspended;
 simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr, simgrid::s4u::Host*)>
     simgrid::kernel::activity::ExecImpl::on_migration;
index 0e6b57e..c70aab5 100644 (file)
@@ -20,8 +20,6 @@ public:
   explicit ExecImpl(std::string name, std::string tracing_category, resource::Action* timeout_detector,
                     s4u::Host* host);
   void start(double flops_amount, double priority, double bound);
-  void suspend() override;
-  void resume() override;
   void cancel();
   void post() override;
   double get_remaining();
@@ -37,11 +35,9 @@ private:
   resource::Action* timeout_detector_ = nullptr;
 
 public:
-  static simgrid::xbt::signal<void(kernel::activity::ExecImplPtr)> on_creation;
-  static simgrid::xbt::signal<void(kernel::activity::ExecImplPtr)> on_completion;
-  static simgrid::xbt::signal<void(kernel::activity::ExecImplPtr)> on_suspended;
-  static simgrid::xbt::signal<void(kernel::activity::ExecImplPtr)> on_resumed;
-  static simgrid::xbt::signal<void(simgrid::kernel::activity::ExecImplPtr, simgrid::s4u::Host*)> on_migration;
+  static simgrid::xbt::signal<void(ExecImplPtr)> on_creation;
+  static simgrid::xbt::signal<void(ExecImplPtr)> on_completion;
+  static simgrid::xbt::signal<void(ExecImplPtr, simgrid::s4u::Host*)> on_migration;
 };
 }
 }
index 8f30719..00fa1b4 100644 (file)
@@ -41,18 +41,6 @@ void simgrid::kernel::activity::IoImpl::cancel()
     surf_action_->cancel();
 }
 
-void simgrid::kernel::activity::IoImpl::suspend()
-{
-  if (surf_action_ != nullptr)
-    surf_action_->suspend();
-}
-
-void simgrid::kernel::activity::IoImpl::resume()
-{
-  if (surf_action_ != nullptr)
-    surf_action_->resume();
-}
-
 double simgrid::kernel::activity::IoImpl::get_remaining()
 {
   return surf_action_ ? surf_action_->get_remains() : 0;
index e61d9ea..b1275e3 100644 (file)
@@ -20,8 +20,6 @@ public:
   explicit IoImpl(std::string name, surf::StorageImpl* storage);
 
   void start(sg_size_t size, simgrid::s4u::Io::OpType type);
-  void suspend() override;
-  void resume() override;
   void post() override;
   void cancel();
   double get_remaining();
index fa13818..e5477aa 100644 (file)
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_process);
 
-void simgrid::kernel::activity::SleepImpl::suspend()
-{
-  surf_action_->suspend();
-}
-
-void simgrid::kernel::activity::SleepImpl::resume()
-{
-  surf_action_->resume();
-}
-
 void simgrid::kernel::activity::SleepImpl::post()
 {
   while (not simcalls_.empty()) {
index 9128912..2f09407 100644 (file)
@@ -15,8 +15,6 @@ namespace activity {
 
 class XBT_PUBLIC SleepImpl : public ActivityImpl {
 public:
-  void suspend() override;
-  void resume() override;
   void post() override;
 
   sg_host_t host                 = nullptr;
index 223748b..236644d 100644 (file)
@@ -53,9 +53,10 @@ static void hostStateChange(s4u::Host& host)
   }
 }
 
-static void addActiveTask(kernel::activity::ExecImplPtr exec)
+static void addActiveTask(kernel::activity::ActivityImplPtr exec)
 {
-  s4u::VirtualMachine *vm = dynamic_cast<s4u::VirtualMachine*>(exec->host_);
+  s4u::VirtualMachine* vm =
+      dynamic_cast<s4u::VirtualMachine*>(boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(exec)->host_);
   if (vm != nullptr) {
     VirtualMachineImpl *vm_impl = vm->get_impl();
     vm_impl->active_tasks_ = vm_impl->active_tasks_ + 1;
@@ -63,9 +64,10 @@ static void addActiveTask(kernel::activity::ExecImplPtr exec)
   }
 }
 
-static void removeActiveTask(kernel::activity::ExecImplPtr exec)
+static void removeActiveTask(kernel::activity::ActivityImplPtr exec)
 {
-  s4u::VirtualMachine *vm = dynamic_cast<s4u::VirtualMachine*>(exec->host_);
+  s4u::VirtualMachine* vm =
+      dynamic_cast<s4u::VirtualMachine*>(boost::static_pointer_cast<simgrid::kernel::activity::ExecImpl>(exec)->host_);
   if (vm != nullptr) {
     VirtualMachineImpl *vm_impl = vm->get_impl();
     vm_impl->active_tasks_ = vm_impl->active_tasks_ - 1;
@@ -79,8 +81,8 @@ VMModel::VMModel()
   s4u::Host::on_state_change.connect(hostStateChange);
   kernel::activity::ExecImpl::on_creation.connect(addActiveTask);
   kernel::activity::ExecImpl::on_completion.connect(removeActiveTask);
-  kernel::activity::ExecImpl::on_resumed.connect(addActiveTask);
-  kernel::activity::ExecImpl::on_suspended.connect(removeActiveTask);  
+  kernel::activity::ActivityImpl::on_resumed.connect(addActiveTask);
+  kernel::activity::ActivityImpl::on_suspended.connect(removeActiveTask);
 }
 
 double VMModel::next_occuring_event(double now)