From: Arnaud Giersch Date: Tue, 9 Mar 2021 12:03:01 +0000 (+0100) Subject: Define (and use) a callback for RawImpl::finish. X-Git-Tag: v3.27~189 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/19aa33ec87e87e1ed8f4742cc4dd60aedb837892 Define (and use) a callback for RawImpl::finish. --- diff --git a/src/kernel/activity/ConditionVariableImpl.cpp b/src/kernel/activity/ConditionVariableImpl.cpp index 89b75a95e6..f8567e9336 100644 --- a/src/kernel/activity/ConditionVariableImpl.cpp +++ b/src/kernel/activity/ConditionVariableImpl.cpp @@ -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); diff --git a/src/kernel/activity/MutexImpl.cpp b/src/kernel/activity/MutexImpl.cpp index 5569f8af10..ee075b790d 100644 --- a/src/kernel/activity/MutexImpl.cpp +++ b/src/kernel/activity/MutexImpl.cpp @@ -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; diff --git a/src/kernel/activity/SemaphoreImpl.cpp b/src/kernel/activity/SemaphoreImpl.cpp index 7f0b5661ba..98d38be483 100644 --- a/src/kernel/activity/SemaphoreImpl.cpp +++ b/src/kernel/activity/SemaphoreImpl.cpp @@ -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); diff --git a/src/kernel/activity/SynchroRaw.cpp b/src/kernel/activity/SynchroRaw.cpp index 87900f3428..a54933725e 100644 --- a/src/kernel/activity/SynchroRaw.cpp +++ b/src/kernel/activity/SynchroRaw.cpp @@ -80,32 +80,7 @@ void RawImpl::finish() xbt_die("Internal error in RawImpl::finish() unexpected synchro state %d", static_cast(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(); } diff --git a/src/kernel/activity/SynchroRaw.hpp b/src/kernel/activity/SynchroRaw.hpp index 09ebc8e7f5..b4ed3931c6 100644 --- a/src/kernel/activity/SynchroRaw.hpp +++ b/src/kernel/activity/SynchroRaw.hpp @@ -8,6 +8,7 @@ #include "src/kernel/activity/ActivityImpl.hpp" #include "surf/surf.hpp" +#include namespace simgrid { namespace kernel { @@ -17,8 +18,10 @@ namespace activity { class XBT_PUBLIC RawImpl : public ActivityImpl_T { sg_host_t host_ = nullptr; double timeout_ = -1; + std::function finish_callback_; public: + explicit RawImpl(const std::function& finish_callback) : finish_callback_(finish_callback) {} RawImpl& set_host(s4u::Host* host); RawImpl& set_timeout(double timeout) override;