Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of https://framagit.org/simgrid/simgrid
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 14 Mar 2019 15:57:45 +0000 (16:57 +0100)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Thu, 14 Mar 2019 15:57:45 +0000 (16:57 +0100)
12 files changed:
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/kernel/activity/SynchroRaw.cpp
src/kernel/activity/SynchroRaw.hpp
src/kernel/actor/ActorImpl.cpp
src/kernel/actor/ActorImpl.hpp

index 5b5c614..757667b 100644 (file)
@@ -11,6 +11,15 @@ namespace simgrid {
 namespace kernel {
 namespace activity {
 
+ActivityImpl::~ActivityImpl()
+{
+  if (surf_action_) {
+    surf_action_->unref();
+    XBT_DEBUG("Destroy activity %p", this);
+    surf_action_ = nullptr;
+  }
+}
+
 void ActivityImpl::suspend()
 {
   if (surf_action_ == nullptr)
index 58e146c..ffb0231 100644 (file)
@@ -24,7 +24,7 @@ class XBT_PUBLIC ActivityImpl {
 public:
   ActivityImpl() = default;
   explicit ActivityImpl(const std::string& name) : name_(name) {}
-  virtual ~ActivityImpl() = default;
+  virtual ~ActivityImpl();
   e_smx_state_t state_ = SIMIX_WAITING; /* State of the activity */
   std::list<smx_simcall_t> simcalls_;   /* List of simcalls waiting for this activity */
   resource::Action* surf_action_ = nullptr;
index 4b66dd2..bffe2f5 100644 (file)
@@ -61,8 +61,6 @@ ExecImpl::ExecImpl(const std::string& name, const std::string& tracing_category)
 
 ExecImpl::~ExecImpl()
 {
-  if (surf_action_)
-    surf_action_->unref();
   if (timeout_detector_)
     timeout_detector_->unref();
   XBT_DEBUG("Destroy exec %p", this);
index 74daa44..e784634 100644 (file)
@@ -16,7 +16,7 @@ namespace activity {
 
 class XBT_PUBLIC ExecImpl : public ActivityImpl {
   resource::Action* timeout_detector_ = nullptr;
-  ~ExecImpl() override;
+  ~ExecImpl();
 
 public:
   explicit ExecImpl(const std::string& name, const std::string& tracing_category);
index 822ff10..1a08cb3 100644 (file)
@@ -37,13 +37,6 @@ namespace simgrid {
 namespace kernel {
 namespace activity {
 
-IoImpl::~IoImpl()
-{
-  if (surf_action_ != nullptr)
-    surf_action_->unref();
-  XBT_DEBUG("Destroy io %p", this);
-}
-
 IoImplPtr IoImpl::set_name(const std::string& name)
 {
   ActivityImpl::set_name(name);
index 5e50b88..e71a11e 100644 (file)
@@ -21,9 +21,6 @@ class XBT_PUBLIC IoImpl : public ActivityImpl {
   sg_size_t performed_ioops_      = 0;
 
 public:
-  ~IoImpl() override;
-  IoImpl() = default;
-
   IoImplPtr set_name(const std::string& name);
   IoImplPtr set_size(sg_size_t size);
   IoImplPtr set_type(s4u::Io::OpType type);
index 8735baf..fd85d9d 100644 (file)
@@ -18,16 +18,27 @@ namespace simgrid {
 namespace kernel {
 namespace activity {
 
-SleepImpl::~SleepImpl()
+SleepImplPtr SleepImpl::set_name(const std::string& name)
 {
-  if (surf_action_)
-    surf_action_->unref();
-  XBT_DEBUG("Destroy activity %p", this);
+  ActivityImpl::set_name(name);
+  return this;
+}
+
+SleepImplPtr SleepImpl::set_host(s4u::Host* host)
+{
+  host_ = host;
+  return this;
 }
 
-SleepImpl* SleepImpl::start(double duration)
+SleepImplPtr SleepImpl::set_duration(double duration)
 {
-  surf_action_ = host_->pimpl_cpu->sleep(duration);
+  duration_ = duration;
+  return this;
+}
+
+SleepImpl* SleepImpl::start()
+{
+  surf_action_ = host_->pimpl_cpu->sleep(duration_);
   surf_action_->set_data(this);
   XBT_DEBUG("Create sleep synchronization %p", this);
   return this;
@@ -73,7 +84,6 @@ void SleepImpl::post()
       SIMIX_simcall_answer(simcall);
     }
   }
-
   SIMIX_process_sleep_destroy(this);
 }
 void SleepImpl::finish()
index 2bf4657..30a004c 100644 (file)
@@ -14,15 +14,16 @@ namespace kernel {
 namespace activity {
 
 class XBT_PUBLIC SleepImpl : public ActivityImpl {
-  ~SleepImpl() override;
+  sg_host_t host_  = nullptr;
+  double duration_ = 0;
 
 public:
-  explicit SleepImpl(const std::string& name, s4u::Host* host) : ActivityImpl(name), host_(host) {}
+  SleepImplPtr set_name(const std::string& name);
+  SleepImplPtr set_host(s4u::Host* host);
+  SleepImplPtr set_duration(double duration);
   void post() override;
   void finish() override;
-  SleepImpl* start(double duration);
-
-  sg_host_t host_ = nullptr;
+  SleepImpl* start();
 };
 } // namespace activity
 } // namespace kernel
index d58e1e4..d736bbf 100644 (file)
@@ -27,11 +27,6 @@ RawImpl* RawImpl::start(s4u::Host* host, double timeout)
   return this;
 }
 
-RawImpl::~RawImpl()
-{
-  surf_action_->unref();
-}
-
 void RawImpl::suspend()
 {
   /* The suspension of raw synchros is delayed to when the process is rescheduled. */
index da5766b..9ed5cf9 100644 (file)
@@ -16,7 +16,6 @@ namespace activity {
   /** Used to implement mutexes, semaphores and conditions */
 class XBT_PUBLIC RawImpl : public ActivityImpl {
 public:
-  ~RawImpl() override;
   RawImpl* start(s4u::Host* host, double timeout);
   void suspend() override;
   void resume() override;
index 1c2fcfb..728f23d 100644 (file)
@@ -388,7 +388,11 @@ activity::ActivityImplPtr ActorImpl::sleep(double duration)
     throw_exception(std::make_exception_ptr(simgrid::HostFailureException(
         XBT_THROW_POINT, std::string("Host ") + host_->get_cname() + " failed, you cannot sleep there.")));
 
-  return activity::SleepImplPtr(new activity::SleepImpl("sleep", host_))->start(duration);
+  return activity::SleepImplPtr(new activity::SleepImpl())
+      ->set_name("sleep")
+      ->set_host(host_)
+      ->set_duration(duration)
+      ->start();
 }
 
 void ActorImpl::throw_exception(std::exception_ptr e)
@@ -413,7 +417,7 @@ void ActorImpl::throw_exception(std::exception_ptr e)
 
     activity::SleepImplPtr sleep = boost::dynamic_pointer_cast<activity::SleepImpl>(waiting_synchro);
     if (sleep != nullptr) {
-      SIMIX_process_sleep_destroy(waiting_synchro);
+      SIMIX_process_sleep_destroy(sleep);
       if (std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), this) ==
               end(simix_global->actors_to_run) &&
           this != SIMIX_process_self()) {
@@ -564,7 +568,7 @@ void SIMIX_process_throw(smx_actor_t actor, xbt_errcat_t cat, int value, const c
     simgrid::kernel::activity::SleepImplPtr sleep =
         boost::dynamic_pointer_cast<simgrid::kernel::activity::SleepImpl>(actor->waiting_synchro);
     if (sleep != nullptr) {
-      SIMIX_process_sleep_destroy(actor->waiting_synchro);
+      SIMIX_process_sleep_destroy(sleep);
       if (std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), actor) ==
               end(simix_global->actors_to_run) &&
           actor != SIMIX_process_self()) {
@@ -665,11 +669,9 @@ void simcall_HANDLER_process_sleep(smx_simcall_t simcall, double duration)
   simcall->issuer->waiting_synchro = sync;
 }
 
-void SIMIX_process_sleep_destroy(smx_activity_t synchro)
+void SIMIX_process_sleep_destroy(simgrid::kernel::activity::SleepImplPtr sleep)
 {
-  XBT_DEBUG("Destroy sleep synchro %p", synchro.get());
-  simgrid::kernel::activity::SleepImplPtr sleep =
-      boost::static_pointer_cast<simgrid::kernel::activity::SleepImpl>(synchro);
+  XBT_DEBUG("Destroy sleep synchro %p", sleep.get());
 
   if (sleep->surf_action_) {
     sleep->surf_action_->unref();
index 3dc9224..cef9f09 100644 (file)
@@ -181,6 +181,6 @@ XBT_PUBLIC void create_maestro(const std::function<void()>& code);
 
 extern void (*SMPI_switch_data_segment)(simgrid::s4u::ActorPtr actor);
 
-XBT_PRIVATE void SIMIX_process_sleep_destroy(smx_activity_t synchro);
+XBT_PRIVATE void SIMIX_process_sleep_destroy(simgrid::kernel::activity::SleepImplPtr synchro);
 
 #endif