From: Arnaud Giersch Date: Tue, 16 Mar 2021 21:17:14 +0000 (+0100) Subject: Modernize simcall cond_wait_timeout. X-Git-Tag: v3.27~112 X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/c1de1bfb13b52bcf4ded13be31ab44b4211cfc13 Modernize simcall cond_wait_timeout. --- diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index ab286fd862..b3e041ce2a 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -206,7 +206,8 @@ XBT_ATTRIB_DEPRECATED_v331("Please use sg_mutex_unlock()") XBT_PUBLIC void simca XBT_ATTRIB_DEPRECATED_v330("Please use sg_cond_init()") XBT_PUBLIC smx_cond_t simcall_cond_init(); XBT_ATTRIB_DEPRECATED_v331("Please use sg_cond_wait()") XBT_PUBLIC void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex); -XBT_PUBLIC int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double max_duration); +XBT_ATTRIB_DEPRECATED_v331("Please use sg_cond_wait_for()") XBT_PUBLIC + int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double max_duration); XBT_ATTRIB_DEPRECATED_v331("Please use sg_sem_acquire()") XBT_PUBLIC void simcall_sem_acquire(smx_sem_t sem); XBT_PUBLIC int simcall_sem_acquire_timeout(smx_sem_t sem, double max_duration); diff --git a/src/kernel/activity/ConditionVariableImpl.cpp b/src/kernel/activity/ConditionVariableImpl.cpp index 87683e1009..418325608a 100644 --- a/src/kernel/activity/ConditionVariableImpl.cpp +++ b/src/kernel/activity/ConditionVariableImpl.cpp @@ -8,18 +8,12 @@ #include "src/kernel/activity/MutexImpl.hpp" #include "src/kernel/activity/SynchroRaw.hpp" #include "src/mc/checker/SimcallObserver.hpp" +#include // std::isfinite XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_condition, simix_synchro, "Condition variables"); /********************************* Condition **********************************/ -/** @brief Handle a condition waiting simcall with timeouts */ -void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout) -{ - simcall_cond_wait_timeout__set__result(simcall, 0); // default result, will be set to 1 on timeout - cond->wait(mutex, timeout, simcall->issuer_); -} - namespace simgrid { namespace kernel { namespace activity { @@ -45,18 +39,10 @@ void ConditionVariableImpl::signal() /* Now transform the cond wait simcall into a mutex lock one */ smx_simcall_t simcall = &proc.simcall_; - MutexImpl* simcall_mutex; - if (simcall->call_ == simix::Simcall::COND_WAIT_TIMEOUT) - simcall_mutex = simcall_cond_wait_timeout__get__mutex(simcall); - else { - // FIXME? using here the MC observer to solve a problem not related to MC - const auto* observer = dynamic_cast(simcall->observer_); - xbt_assert(observer != nullptr); - simcall_mutex = observer->get_mutex(); - } - simcall->call_ = simix::Simcall::RUN_BLOCKING; - - simcall_mutex->lock(simcall->issuer_); + // FIXME? using here the MC observer to solve a problem not related to MC + const auto* observer = dynamic_cast(simcall->observer_); + xbt_assert(observer != nullptr); + observer->get_mutex()->lock(simcall->issuer_); } XBT_OUT(); } @@ -79,6 +65,8 @@ void ConditionVariableImpl::broadcast() void ConditionVariableImpl::wait(smx_mutex_t mutex, double timeout, actor::ActorImpl* issuer) { XBT_DEBUG("Wait condition %p", this); + 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 there is a mutex unlock it */ if (mutex != nullptr) { @@ -91,8 +79,7 @@ void ConditionVariableImpl::wait(smx_mutex_t mutex, double timeout, actor::Actor 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); + simix::marshal(issuer->simcall_.result_, true); })); synchro->set_host(issuer->get_host()).set_timeout(timeout).start(); synchro->register_simcall(&issuer->simcall_); diff --git a/src/s4u/s4u_ConditionVariable.cpp b/src/s4u/s4u_ConditionVariable.cpp index e43d0e9ff3..cb316eadc2 100644 --- a/src/s4u/s4u_ConditionVariable.cpp +++ b/src/s4u/s4u_ConditionVariable.cpp @@ -8,6 +8,7 @@ #include "simgrid/s4u/ConditionVariable.hpp" #include "simgrid/simix.h" #include "src/kernel/activity/ConditionVariableImpl.hpp" +#include "src/kernel/activity/MutexImpl.hpp" #include "src/mc/checker/SimcallObserver.hpp" #include "xbt/log.hpp" @@ -49,7 +50,13 @@ std::cv_status s4u::ConditionVariable::wait_for(const std::unique_lock& l if (timeout < 0) timeout = 0.0; - if (simcall_cond_wait_timeout(pimpl_, lock.mutex()->pimpl_, timeout)) { + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); + mc::ConditionWaitSimcall observer{issuer, pimpl_, lock.mutex()->pimpl_, timeout}; + kernel::actor::simcall_blocking( + [&observer] { observer.get_cond()->wait(observer.get_mutex(), observer.get_timeout(), observer.get_issuer()); }, + &observer); + bool timed_out = simgrid::simix::unmarshal(issuer->simcall_.result_); + if (timed_out) { // If we reached the timeout, we have to take the lock again: lock.mutex()->lock(); return std::cv_status::timeout; @@ -109,7 +116,7 @@ void sg_cond_wait(sg_cond_t cond, sg_mutex_t mutex) int sg_cond_wait_for(sg_cond_t cond, sg_mutex_t mutex, double delay) { std::unique_lock lock(*mutex); - return cond->wait_for(lock, delay) == std::cv_status::timeout ? 1 : 0; + return cond->wait_for(lock, delay) == std::cv_status::timeout; } void sg_cond_notify_one(sg_cond_t cond) diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index d9ea4dcb5e..4c049a4a34 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -301,10 +301,10 @@ void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex) // XBT_ATTRIB_DEPRECA * @ingroup simix_synchro_management * */ -int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) +int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) // XBT_ATTRIB_DEPRECATD_v331 { - xbt_assert(std::isfinite(timeout), "timeout is not finite!"); - return simcall_BODY_cond_wait_timeout(cond, mutex, timeout); + return cond->get_iface()->wait_for(std::unique_lock(mutex->mutex()), timeout) == + std::cv_status::timeout; } /** diff --git a/src/simix/popping_accessors.hpp b/src/simix/popping_accessors.hpp index 2f18af556d..49484b2b1d 100644 --- a/src/simix/popping_accessors.hpp +++ b/src/simix/popping_accessors.hpp @@ -684,55 +684,6 @@ static inline void simcall_comm_wait__set__timeout(smx_simcall_t simcall, double simgrid::simix::marshal(simcall->args_[1], arg); } -static inline smx_cond_t simcall_cond_wait_timeout__get__cond(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[0]); -} -static inline smx_cond_t simcall_cond_wait_timeout__getraw__cond(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[0]); -} -static inline void simcall_cond_wait_timeout__set__cond(smx_simcall_t simcall, smx_cond_t arg) -{ - simgrid::simix::marshal(simcall->args_[0], arg); -} -static inline smx_mutex_t simcall_cond_wait_timeout__get__mutex(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[1]); -} -static inline smx_mutex_t simcall_cond_wait_timeout__getraw__mutex(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[1]); -} -static inline void simcall_cond_wait_timeout__set__mutex(smx_simcall_t simcall, smx_mutex_t arg) -{ - simgrid::simix::marshal(simcall->args_[1], arg); -} -static inline double simcall_cond_wait_timeout__get__timeout(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[2]); -} -static inline double simcall_cond_wait_timeout__getraw__timeout(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[2]); -} -static inline void simcall_cond_wait_timeout__set__timeout(smx_simcall_t simcall, double arg) -{ - simgrid::simix::marshal(simcall->args_[2], arg); -} -static inline int simcall_cond_wait_timeout__get__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->result_); -} -static inline int simcall_cond_wait_timeout__getraw__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->result_); -} -static inline void simcall_cond_wait_timeout__set__result(smx_simcall_t simcall, int result) -{ - simgrid::simix::marshal(simcall->result_, result); -} - static inline smx_sem_t simcall_sem_acquire_timeout__get__sem(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->args_[0]); @@ -807,5 +758,4 @@ XBT_PRIVATE void simcall_HANDLER_comm_test(smx_simcall_t simcall, simgrid::kerne XBT_PRIVATE void simcall_HANDLER_comm_testany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count); XBT_PRIVATE void simcall_HANDLER_comm_waitany(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout); XBT_PRIVATE void simcall_HANDLER_comm_wait(smx_simcall_t simcall, simgrid::kernel::activity::CommImpl* comm, double timeout); -XBT_PRIVATE void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout); XBT_PRIVATE void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout); diff --git a/src/simix/popping_bodies.cpp b/src/simix/popping_bodies.cpp index 6e818e8aa9..01e638fc4b 100644 --- a/src/simix/popping_bodies.cpp +++ b/src/simix/popping_bodies.cpp @@ -104,13 +104,6 @@ inline static void simcall_BODY_comm_wait(simgrid::kernel::activity::CommImpl* c return simcall(Simcall::COMM_WAIT, comm, timeout); } -inline static int simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) -{ - if (false) /* Go to that function to follow the code flow through the simcall barrier */ - simcall_HANDLER_cond_wait_timeout(&SIMIX_process_self()->simcall_, cond, mutex, timeout); - return simcall(Simcall::COND_WAIT_TIMEOUT, cond, mutex, timeout); -} - inline static int simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) { if (false) /* Go to that function to follow the code flow through the simcall barrier */ diff --git a/src/simix/popping_enum.hpp b/src/simix/popping_enum.hpp index 44ddc0ad1f..1c51894c9f 100644 --- a/src/simix/popping_enum.hpp +++ b/src/simix/popping_enum.hpp @@ -30,12 +30,11 @@ enum class Simcall { COMM_TESTANY, COMM_WAITANY, COMM_WAIT, - COND_WAIT_TIMEOUT, SEM_ACQUIRE_TIMEOUT, RUN_KERNEL, RUN_BLOCKING, }; -constexpr int NUM_SIMCALLS = 14; +constexpr int NUM_SIMCALLS = 13; } // namespace simix } // namespace simgrid diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index cd7b155800..9fb5a7effe 100644 --- a/src/simix/popping_generated.cpp +++ b/src/simix/popping_generated.cpp @@ -38,7 +38,6 @@ constexpr std::array simcall_names{{ "Simcall::COMM_TESTANY", "Simcall::COMM_WAITANY", "Simcall::COMM_WAIT", - "Simcall::COND_WAIT_TIMEOUT", "Simcall::SEM_ACQUIRE_TIMEOUT", "Simcall::RUN_KERNEL", "Simcall::RUN_BLOCKING", @@ -96,10 +95,6 @@ void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered_) simcall_HANDLER_comm_wait(&simcall_, simgrid::simix::unmarshal(simcall_.args_[0]), simgrid::simix::unmarshal(simcall_.args_[1])); break; - case Simcall::COND_WAIT_TIMEOUT: - simcall_HANDLER_cond_wait_timeout(&simcall_, simgrid::simix::unmarshal(simcall_.args_[0]), simgrid::simix::unmarshal(simcall_.args_[1]), simgrid::simix::unmarshal(simcall_.args_[2])); - break; - case Simcall::SEM_ACQUIRE_TIMEOUT: simcall_HANDLER_sem_acquire_timeout(&simcall_, simgrid::simix::unmarshal(simcall_.args_[0]), simgrid::simix::unmarshal(simcall_.args_[1])); break; diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index cf83ac8d03..00c3f4be12 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -46,8 +46,6 @@ int comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t int comm_waitany(simgrid::kernel::activity::CommImpl** comms, size_t count, double timeout) [[block]]; void comm_wait(simgrid::kernel::activity::CommImpl* comm, double timeout) [[block]]; -int cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) [[block]]; - int sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]]; void run_kernel(std::function const* code) [[nohandler]];