Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Defuse a trap on refcounting activities by adding a comment
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Sat, 12 Mar 2022 10:47:26 +0000 (11:47 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Sat, 12 Mar 2022 10:47:53 +0000 (11:47 +0100)
src/kernel/actor/ActorImpl.cpp

index 9e889be..67c9d55 100644 (file)
@@ -204,12 +204,14 @@ void ActorImpl::exit()
   suspended_ = false;
   exception_ = nullptr;
 
-  /* destroy the blocking synchro if any */
   if (waiting_synchro_ != nullptr) {
+    /* Take an extra reference on the activity object that may be unref by Comm::finish() or friends */
+    activity::ActivityImplPtr activity = waiting_synchro_;
+    activity->cancel();
+    activity->set_state(activity::State::FAILED);
+    activity->post();
+
     activities_.remove(waiting_synchro_);
-    waiting_synchro_->cancel();
-    waiting_synchro_->set_state(activity::State::FAILED);
-    waiting_synchro_->post();
     waiting_synchro_ = nullptr;
   }
   for (auto const& activity : activities_)