Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define (and use) a callback for RawImpl::finish.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 9 Mar 2021 12:03:01 +0000 (13:03 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 9 Mar 2021 20:14:44 +0000 (21:14 +0100)
src/kernel/activity/ConditionVariableImpl.cpp
src/kernel/activity/MutexImpl.cpp
src/kernel/activity/SemaphoreImpl.cpp
src/kernel/activity/SynchroRaw.cpp
src/kernel/activity/SynchroRaw.hpp

index 89b75a9..f8567e9 100644 (file)
@@ -90,7 +90,11 @@ void ConditionVariableImpl::wait(smx_mutex_t mutex, double timeout, actor::Actor
     mutex->unlock(issuer);
   }
 
-  RawImplPtr synchro(new RawImpl());
+  RawImplPtr synchro(new RawImpl([this, issuer]() {
+    this->remove_sleeping_actor(*issuer);
+    if (issuer->simcall_.call_ == simix::Simcall::COND_WAIT_TIMEOUT)
+      simcall_cond_wait_timeout__set__result(&issuer->simcall_, 1);
+  }));
   synchro->set_host(issuer->get_host()).set_timeout(timeout).start();
   synchro->register_simcall(&issuer->simcall_);
   sleeping_.push_back(*issuer);
index 5569f8a..ee075b7 100644 (file)
@@ -21,7 +21,7 @@ void MutexImpl::lock(actor::ActorImpl* issuer)
   if (locked_) {
     /* FIXME: check if the host is active ? */
     /* Somebody using the mutex, use a synchronization to get host failures */
-    synchro = RawImplPtr(new RawImpl());
+    synchro = RawImplPtr(new RawImpl([this, issuer]() { this->remove_sleeping_actor(*issuer); }));
     (*synchro).set_host(issuer->get_host()).start();
     synchro->simcalls_.push_back(&issuer->simcall_);
     issuer->waiting_synchro_ = synchro;
index 7f0b566..98d38be 100644 (file)
@@ -16,7 +16,11 @@ void SemaphoreImpl::acquire(actor::ActorImpl* issuer, double timeout)
 {
   XBT_DEBUG("Wait semaphore %p (timeout:%f)", this, timeout);
   if (value_ <= 0) {
-    RawImplPtr synchro(new RawImpl());
+    RawImplPtr synchro(new RawImpl([this, issuer]() {
+      this->remove_sleeping_actor(*issuer);
+      if (issuer->simcall_.call_ == simix::Simcall::SEM_ACQUIRE_TIMEOUT)
+        simcall_sem_acquire_timeout__set__result(&issuer->simcall_, 1);
+    }));
     synchro->set_host(issuer->get_host()).set_timeout(timeout).start();
     synchro->register_simcall(&issuer->simcall_);
     sleeping_.push_back(*issuer);
index 87900f3..a549337 100644 (file)
@@ -80,32 +80,7 @@ void RawImpl::finish()
     xbt_die("Internal error in RawImpl::finish() unexpected synchro state %d", static_cast<int>(state_));
   }
 
-  switch (simcall->call_) {
-    case simix::Simcall::MUTEX_LOCK:
-      simcall_mutex_lock__get__mutex(simcall)->remove_sleeping_actor(*simcall->issuer_);
-      break;
-
-    case simix::Simcall::COND_WAIT:
-      simcall_cond_wait_timeout__get__cond(simcall)->remove_sleeping_actor(*simcall->issuer_);
-      break;
-
-    case simix::Simcall::COND_WAIT_TIMEOUT:
-      simcall_cond_wait_timeout__get__cond(simcall)->remove_sleeping_actor(*simcall->issuer_);
-      simcall_cond_wait_timeout__set__result(simcall, 1); // signal a timeout
-      break;
-
-    case simix::Simcall::SEM_ACQUIRE:
-      simcall_sem_acquire_timeout__get__sem(simcall)->remove_sleeping_actor(*simcall->issuer_);
-      break;
-
-    case simix::Simcall::SEM_ACQUIRE_TIMEOUT:
-      simcall_sem_acquire_timeout__get__sem(simcall)->remove_sleeping_actor(*simcall->issuer_);
-      simcall_sem_acquire_timeout__set__result(simcall, 1); // signal a timeout
-      break;
-
-    default:
-      THROW_IMPOSSIBLE;
-  }
+  finish_callback_();
   simcall->issuer_->waiting_synchro_ = nullptr;
   simcall->issuer_->simcall_answer();
 }
index 09ebc8e..b4ed393 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "src/kernel/activity/ActivityImpl.hpp"
 #include "surf/surf.hpp"
+#include <functional>
 
 namespace simgrid {
 namespace kernel {
@@ -17,8 +18,10 @@ namespace activity {
 class XBT_PUBLIC RawImpl : public ActivityImpl_T<RawImpl> {
   sg_host_t host_ = nullptr;
   double timeout_ = -1;
+  std::function<void()> finish_callback_;
 
 public:
+  explicit RawImpl(const std::function<void()>& finish_callback) : finish_callback_(finish_callback) {}
   RawImpl& set_host(s4u::Host* host);
   RawImpl& set_timeout(double timeout) override;