Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
New signal: Actor::on_termination (when its code terminates)
[simgrid.git] / src / kernel / actor / ActorImpl.cpp
index fc75399..992ab56 100644 (file)
@@ -61,9 +61,11 @@ ActorImpl::ActorImpl(const simgrid::xbt::string& name, s4u::Host* host) : host_(
 
 ActorImpl::~ActorImpl()
 {
-  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(*ciface()); });
-  context_->iwannadie = true;
+  if (this != simix_global->maestro_process) {
+    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(*ciface()); });
+    context_->iwannadie = true;
+  }
 }
 
 /* Become an actor in the simulation
@@ -183,6 +185,10 @@ void ActorImpl::cleanup()
   }
 
   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_termination(*ciface()); });
+  context_->iwannadie = true;
 }
 
 void ActorImpl::exit()