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);
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;
{
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);
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();
}
#include "src/kernel/activity/ActivityImpl.hpp"
#include "surf/surf.hpp"
+#include <functional>
namespace simgrid {
namespace kernel {
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;