Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ptask_BMF: refactor code and loop scenarios
[simgrid.git] / src / kernel / actor / ActorImpl.cpp
index cd885a1..49c758a 100644 (file)
@@ -169,6 +169,9 @@ void ActorImpl::cleanup()
     activity->cancel();
   activities_.clear();
 
+  while (not mailboxes.empty())
+    mailboxes.back()->set_receiver(nullptr);
+
   XBT_DEBUG("%s@%s(%ld) should not run anymore", get_cname(), get_host()->get_cname(), get_pid());
 
   if (EngineImpl::get_instance()->is_maestro(this)) /* Do not cleanup maestro */
@@ -200,25 +203,21 @@ void ActorImpl::exit()
   exception_          = nullptr;
 
   /* destroy the blocking synchro if any */
-  if (waiting_synchro_ != nullptr) {
-    waiting_synchro_->cancel();
-    waiting_synchro_->set_state(activity::State::FAILED);
-
-    if (auto exec = boost::dynamic_pointer_cast<activity::ExecImpl>(waiting_synchro_)) {
-      exec->clean_action();
-    } else if (auto comm = boost::dynamic_pointer_cast<activity::CommImpl>(waiting_synchro_)) {
-      comm->unregister_simcall(&simcall_);
-    } else {
-      activity::ActivityImplPtr(waiting_synchro_)->finish();
-    }
-
+  if (auto activity = waiting_synchro_) {
     activities_.remove(waiting_synchro_);
     waiting_synchro_ = nullptr;
+
+    activity->cancel();
+    activity->set_state(activity::State::FAILED);
+    activity->post();
   }
   for (auto const& activity : activities_)
     activity->cancel();
   activities_.clear();
 
+  while (not mailboxes.empty())
+    mailboxes.back()->set_receiver(nullptr);
+
   // Forcefully kill the actor if its host is turned off. Not a HostFailureException because you should not survive that
   this->throw_exception(std::make_exception_ptr(ForcefulKillException(host_->is_on() ? "exited" : "host failed")));
 }