Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
stick to our coding standards: fields must have a trailing _
[simgrid.git] / src / kernel / actor / ActorImpl.cpp
index c42198b..258ce94 100644 (file)
@@ -13,7 +13,7 @@
 #include "src/kernel/activity/SleepImpl.hpp"
 #include "src/kernel/activity/SynchroRaw.hpp"
 #include "src/mc/mc_replay.hpp"
-#include "src/mc/remote/Client.hpp"
+#include "src/mc/remote/AppSide.hpp"
 #include "src/simix/smx_private.hpp"
 #include "src/surf/HostImpl.hpp"
 #include "src/surf/cpu_interface.hpp"
@@ -47,15 +47,16 @@ int get_maxpid()
 
 ActorImpl* ActorImpl::self()
 {
-  context::Context* self_context = context::Context::self();
+  const context::Context* self_context = context::Context::self();
 
   return (self_context != nullptr) ? self_context->get_actor() : nullptr;
 }
 
 ActorImpl::ActorImpl(xbt::string name, s4u::Host* host) : host_(host), name_(std::move(name)), piface_(this)
 {
-  pid_           = maxpid++;
-  simcall.issuer_ = this;
+  pid_            = maxpid++;
+  simcall_.issuer_ = this;
+  stacksize_      = smx_context_stack_size;
 }
 
 ActorImpl::~ActorImpl()
@@ -165,22 +166,27 @@ void ActorImpl::cleanup()
   undaemonize();
 
   /* cancel non-blocking activities */
-  for (auto activity : comms)
-    boost::static_pointer_cast<activity::CommImpl>(activity)->cancel();
-  comms.clear();
+  for (auto activity : activities_)
+    activity->cancel();
+  activities_.clear();
 
   XBT_DEBUG("%s@%s(%ld) should not run anymore", get_cname(), get_host()->get_cname(), get_pid());
 
   if (this == simix_global->maestro_) /* Do not cleanup maestro */
     return;
 
-  XBT_DEBUG("Cleanup actor %s (%p), waiting synchro %p", get_cname(), this, waiting_synchro.get());
+  XBT_DEBUG("Cleanup actor %s (%p), waiting synchro %p", get_cname(), this, waiting_synchro_.get());
 
-  /* Unregister from the kill timer if any */
-  if (kill_timer != nullptr) {
-    kill_timer->remove();
-    kill_timer = nullptr;
+  /* Unregister associated timers if any */
+  if (kill_timer_ != nullptr) {
+    kill_timer_->remove();
+    kill_timer_ = nullptr;
   }
+  if (simcall_.timeout_cb_) {
+    simcall_.timeout_cb_->remove();
+    simcall_.timeout_cb_ = nullptr;
+  }
+
   cleanup_from_simix();
 
   context_->set_wannadie(false); // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
@@ -195,26 +201,26 @@ void ActorImpl::exit()
   exception_          = nullptr;
 
   /* destroy the blocking synchro if any */
-  if (waiting_synchro != nullptr) {
-    waiting_synchro->cancel();
-    waiting_synchro->state_ = activity::State::FAILED;
+  if (waiting_synchro_ != nullptr) {
+    waiting_synchro_->cancel();
+    waiting_synchro_->state_ = activity::State::FAILED;
 
-    activity::ExecImplPtr exec   = boost::dynamic_pointer_cast<activity::ExecImpl>(waiting_synchro);
-    activity::CommImplPtr comm   = boost::dynamic_pointer_cast<activity::CommImpl>(waiting_synchro);
+    activity::ExecImplPtr exec = boost::dynamic_pointer_cast<activity::ExecImpl>(waiting_synchro_);
+    activity::CommImplPtr comm = boost::dynamic_pointer_cast<activity::CommImpl>(waiting_synchro_);
 
     if (exec != nullptr) {
       exec->clean_action();
     } else if (comm != nullptr) {
-      comms.remove(waiting_synchro);
       // Remove first occurrence of &actor->simcall:
-      auto i = boost::range::find(waiting_synchro->simcalls_, &simcall);
-      if (i != waiting_synchro->simcalls_.end())
-        waiting_synchro->simcalls_.remove(&simcall);
+      auto i = boost::range::find(waiting_synchro_->simcalls_, &simcall_);
+      if (i != waiting_synchro_->simcalls_.end())
+        waiting_synchro_->simcalls_.remove(&simcall_);
     } else {
-      activity::ActivityImplPtr(waiting_synchro)->finish();
+      activity::ActivityImplPtr(waiting_synchro_)->finish();
     }
 
-    waiting_synchro = nullptr;
+    activities_.remove(waiting_synchro_);
+    waiting_synchro_ = nullptr;
   }
 
   // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that
@@ -258,15 +264,15 @@ void ActorImpl::set_kill_time(double kill_time)
   if (kill_time <= SIMIX_get_clock())
     return;
   XBT_DEBUG("Set kill time %f for actor %s@%s", kill_time, get_cname(), host_->get_cname());
-  kill_timer = simix::Timer::set(kill_time, [this] {
+  kill_timer_ = simix::Timer::set(kill_time, [this] {
     this->exit();
-    kill_timer = nullptr;
+    kill_timer_ = nullptr;
   });
 }
 
 double ActorImpl::get_kill_time()
 {
-  return kill_timer ? kill_timer->get_date() : 0;
+  return kill_timer_ ? kill_timer_->get_date() : 0;
 }
 
 void ActorImpl::yield()
@@ -291,6 +297,7 @@ void ActorImpl::yield()
     xbt_assert(exception_ == nullptr, "Gasp! This exception may be lost by subsequent calls.");
     suspended_ = false;
     suspend();
+    yield(); // Yield back to maestro without proceeding with my execution. I'll get resumed at some point
   }
 
   if (exception_ != nullptr) {
@@ -360,14 +367,14 @@ void ActorImpl::suspend()
   suspended_ = true;
 
   /* If the suspended actor is waiting on a sync, suspend its synchronization. */
-  if (waiting_synchro == nullptr) {
+  if (waiting_synchro_ == nullptr) {
     auto exec = new activity::ExecImpl();
     exec->set_name("suspend").set_host(host_).set_flops_amount(0.0).start();
-    waiting_synchro = activity::ExecImplPtr(exec);
+    waiting_synchro_ = activity::ExecImplPtr(exec);
 
-    waiting_synchro->simcalls_.push_back(&simcall);
+    waiting_synchro_->simcalls_.push_back(&simcall_);
   }
-  waiting_synchro->suspend();
+  waiting_synchro_->suspend();
 }
 
 void ActorImpl::resume()
@@ -384,8 +391,8 @@ void ActorImpl::resume()
   suspended_ = false;
 
   /* resume the synchronization that was blocking the resumed actor. */
-  if (waiting_synchro)
-    waiting_synchro->resume();
+  if (waiting_synchro_)
+    waiting_synchro_->resume();
 
   XBT_OUT();
 }
@@ -419,24 +426,20 @@ void ActorImpl::throw_exception(std::exception_ptr e)
     resume();
 
   /* cancel the blocking synchro if any */
-  if (waiting_synchro) {
-    waiting_synchro->cancel();
-
-    activity::CommImplPtr comm = boost::dynamic_pointer_cast<activity::CommImpl>(waiting_synchro);
-
-    if (comm != nullptr)
-      comms.remove(comm);
-
-    waiting_synchro = nullptr;
+  if (waiting_synchro_) {
+    waiting_synchro_->cancel();
+    activities_.remove(waiting_synchro_);
+    waiting_synchro_ = nullptr;
   }
 }
 
 void ActorImpl::simcall_answer()
 {
   if (this != simix_global->maestro_) {
-    XBT_DEBUG("Answer simcall %s (%d) issued by %s (%p)", SIMIX_simcall_name(simcall.call_), (int)simcall.call_,
+    XBT_DEBUG("Answer simcall %s (%d) issued by %s (%p)", SIMIX_simcall_name(simcall_.call_), (int)simcall_.call_,
               get_cname(), this);
-    simcall.call_ = SIMCALL_NONE;
+    xbt_assert(simcall_.call_ != SIMCALL_NONE);
+    simcall_.call_ = SIMCALL_NONE;
     xbt_assert(not XBT_LOG_ISENABLED(simix_process, xbt_log_priority_debug) ||
                    std::find(begin(simix_global->actors_to_run), end(simix_global->actors_to_run), this) ==
                        end(simix_global->actors_to_run),
@@ -525,7 +528,7 @@ void create_maestro(const std::function<void()>& code)
     maestro->context_.reset(simix_global->context_factory->create_maestro(ActorCode(code), maestro));
   }
 
-  maestro->simcall.issuer_      = maestro;
+  maestro->simcall_.issuer_     = maestro;
   simix_global->maestro_        = maestro;
 }