Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
further let the actor clean for itself
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 14 Mar 2019 22:16:56 +0000 (23:16 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 14 Mar 2019 22:29:02 +0000 (23:29 +0100)
src/kernel/actor/ActorImpl.cpp
src/kernel/context/Context.cpp

index 37c1d13..55888da 100644 (file)
@@ -133,6 +133,29 @@ void ActorImpl::detach()
 
 void ActorImpl::cleanup()
 {
+  finished_ = true;
+
+  if (has_to_auto_restart() && not get_host()->is_on()) {
+    XBT_DEBUG("Insert host %s to watched_hosts because it's off and %s needs to restart", get_host()->get_cname(),
+              get_cname());
+    watched_hosts.insert(get_host()->get_name());
+  }
+
+  // Execute the termination callbacks
+  smx_process_exit_status_t exit_status = (context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
+  while (not on_exit.empty()) {
+    s_smx_process_exit_fun_t exit_fun = on_exit.back();
+    on_exit.pop_back();
+    (exit_fun.fun)(exit_status, exit_fun.arg);
+  }
+
+  /* cancel non-blocking activities */
+  for (auto activity : comms)
+    boost::static_pointer_cast<activity::CommImpl>(activity)->cancel();
+  comms.clear();
+
+  XBT_DEBUG("%s@%s(%ld) should not run anymore", get_cname(), get_host()->get_cname(), get_pid());
+
   if (this == simix_global->maestro_process) /* Do not cleanup maestro */
     return;
 
@@ -155,9 +178,12 @@ void ActorImpl::cleanup()
 #endif
     simix_global->actors_to_destroy.push_back(*this);
   }
-  context_->iwannadie = false;
 
   simix_global->mutex.unlock();
+
+  context_->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), to avoid infinite loops
+  simgrid::simix::simcall([this] { simgrid::s4u::Actor::on_destruction(iface()); });
+  context_->iwannadie = true;
 }
 
 void ActorImpl::exit()
index b69f8d0..ba398a1 100644 (file)
@@ -69,37 +69,7 @@ Context::~Context()
 
 void Context::stop()
 {
-  actor_->finished_ = true;
-
-  if (actor_->has_to_auto_restart() && not actor_->get_host()->is_on()) {
-    XBT_DEBUG("Insert host %s to watched_hosts because it's off and %s needs to restart",
-              actor_->get_host()->get_cname(), actor_->get_cname());
-    watched_hosts.insert(actor_->get_host()->get_name());
-  }
-
-  // Execute the termination callbacks
-  smx_process_exit_status_t exit_status = (actor_->context_->iwannadie) ? SMX_EXIT_FAILURE : SMX_EXIT_SUCCESS;
-  while (not actor_->on_exit.empty()) {
-    s_smx_process_exit_fun_t exit_fun = actor_->on_exit.back();
-    actor_->on_exit.pop_back();
-    (exit_fun.fun)(exit_status, exit_fun.arg);
-  }
-
-  /* cancel non-blocking activities */
-  for (auto activity : actor_->comms)
-    boost::static_pointer_cast<activity::CommImpl>(activity)->cancel();
-  actor_->comms.clear();
-
-  XBT_DEBUG("%s@%s(%ld) should not run anymore", actor_->get_cname(), actor_->iface()->get_host()->get_cname(),
-            actor_->get_pid());
-
   this->actor_->cleanup();
-
-  this->iwannadie = false; // don't let the simcall's yield() do a Context::stop(), because that's me
-  simgrid::simix::simcall([this] {
-    simgrid::s4u::Actor::on_destruction(actor_->iface());
-  });
-  this->iwannadie = true;
 }
 
 AttachContext::~AttachContext() = default;