X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b8dc7c0693d2606e9cb9f21bcced90a5174bd503..89f389e6348fde6457d692ef1f0a81d55f658b1d:/src/kernel/activity/SemaphoreImpl.cpp diff --git a/src/kernel/activity/SemaphoreImpl.cpp b/src/kernel/activity/SemaphoreImpl.cpp index 4848f27bf7..eb3c0f81f8 100644 --- a/src/kernel/activity/SemaphoreImpl.cpp +++ b/src/kernel/activity/SemaphoreImpl.cpp @@ -1,10 +1,11 @@ -/* Copyright (c) 2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2019-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/kernel/activity/SemaphoreImpl.hpp" #include "src/kernel/activity/SynchroRaw.hpp" +#include // std::isfinite XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_semaphore, simix_synchro, "Semaphore kernel-space implementation"); @@ -14,14 +15,17 @@ namespace activity { void SemaphoreImpl::acquire(actor::ActorImpl* issuer, double timeout) { - RawImplPtr synchro = nullptr; - XBT_DEBUG("Wait semaphore %p (timeout:%f)", this, timeout); + xbt_assert(std::isfinite(timeout), "timeout is not finite!"); + simix::marshal(issuer->simcall_.result_, false); // default result, will be set to 'true' on timeout + if (value_ <= 0) { - synchro = RawImplPtr(new RawImpl()); - (*synchro).set_host(issuer->get_host()).set_timeout(timeout).start(); - synchro->simcalls_.push_front(&issuer->simcall); - issuer->waiting_synchro = synchro; + RawImplPtr synchro(new RawImpl([this, issuer]() { + this->remove_sleeping_actor(*issuer); + simix::marshal(issuer->simcall_.result_, true); + })); + synchro->set_host(issuer->get_host()).set_timeout(timeout).start(); + synchro->register_simcall(&issuer->simcall_); sleeping_.push_back(*issuer); } else { value_--; @@ -35,31 +39,26 @@ void SemaphoreImpl::release() if (not sleeping_.empty()) { auto& actor = sleeping_.front(); sleeping_.pop_front(); - actor.waiting_synchro = nullptr; + actor.waiting_synchro_ = nullptr; actor.simcall_answer(); } else { value_++; } } -} // namespace activity -} // namespace kernel -} // namespace simgrid - -// Simcall handlers: -/** - * @brief Handles a sem acquire simcall without timeout. - */ -void simcall_HANDLER_sem_acquire(smx_simcall_t simcall, smx_sem_t sem) +/** Increase the refcount for this semaphore */ +SemaphoreImpl* SemaphoreImpl::ref() { - sem->acquire(simcall->issuer_, -1); + intrusive_ptr_add_ref(this); + return this; } -/** - * @brief Handles a sem acquire simcall with timeout. - */ -void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout) +/** Decrease the refcount for this mutex */ +void SemaphoreImpl::unref() { - simcall_sem_acquire_timeout__set__result(simcall, 0); // default result, will be set to 1 on timeout - sem->acquire(simcall->issuer_, timeout); + intrusive_ptr_release(this); } + +} // namespace activity +} // namespace kernel +} // namespace simgrid