Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix a race condition
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 7 Jan 2019 10:34:57 +0000 (11:34 +0100)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Mon, 7 Jan 2019 10:35:00 +0000 (11:35 +0100)
When saving the context of maestro, we must ensure that we are
actually thread 0. Otherwise, we may end up saving the context of a
minion (a working thread).

src/kernel/context/ContextSwapped.cpp
src/kernel/context/ContextSwapped.hpp

index cb2f314..87da1fc 100644 (file)
@@ -134,9 +134,16 @@ SwappedContext::~SwappedContext()
   xbt_free(stack_);
 }
 
+void SwappedContext::set_maestro(SwappedContext* ctx)
+{
+  if (factory_->threads_working_ == 0) // Don't save the soul of minions, only the one of maestro
+    factory_->workers_context_[0] = ctx;
+}
+
 void SwappedContext::stop()
 {
   Context::stop();
+  /* We must cut the actor execution using an exception to properly free the C++ RAII variables */
   throw StopRequest();
 }
 
index 41a1747..606dd44 100644 (file)
@@ -45,7 +45,7 @@ public:
 
   virtual void swap_into(SwappedContext* to) = 0; // Defined in Raw, Boost and UContext subclasses
 
-  void set_maestro(SwappedContext* ctx) { factory_->workers_context_[0] = ctx; }
+  void set_maestro(SwappedContext* ctx);
 
   // FIXME: Killme
   static thread_local uintptr_t worker_id_;