From 89f389e6348fde6457d692ef1f0a81d55f658b1d Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Tue, 16 Mar 2021 22:38:10 +0100 Subject: [PATCH] Modernize simcall sem_acquire_timeout. Note: we need a test for that. --- include/simgrid/simix.h | 3 ++- src/kernel/activity/SemaphoreImpl.cpp | 17 ++++-------- src/s4u/s4u_Semaphore.cpp | 6 ++++- src/simix/libsmx.cpp | 5 ++-- src/simix/popping_accessors.hpp | 38 --------------------------- src/simix/popping_bodies.cpp | 7 ----- src/simix/popping_enum.hpp | 3 +-- src/simix/popping_generated.cpp | 5 ---- src/simix/simcalls.in | 2 -- 9 files changed, 15 insertions(+), 71 deletions(-) diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index b3e041ce2a..bb3763ab6b 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -210,7 +210,8 @@ 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); +XBT_ATTRIB_DEPRECATED_v331("Please use sg_sem_acquire_timeout()") XBT_PUBLIC + int simcall_sem_acquire_timeout(smx_sem_t sem, double max_duration); SG_END_DECL /***************************** Io **************************************/ diff --git a/src/kernel/activity/SemaphoreImpl.cpp b/src/kernel/activity/SemaphoreImpl.cpp index ec75b827bd..eb3c0f81f8 100644 --- a/src/kernel/activity/SemaphoreImpl.cpp +++ b/src/kernel/activity/SemaphoreImpl.cpp @@ -5,6 +5,7 @@ #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"); @@ -15,11 +16,13 @@ namespace activity { void SemaphoreImpl::acquire(actor::ActorImpl* issuer, double timeout) { 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) { 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); + simix::marshal(issuer->simcall_.result_, true); })); synchro->set_host(issuer->get_host()).set_timeout(timeout).start(); synchro->register_simcall(&issuer->simcall_); @@ -59,13 +62,3 @@ void SemaphoreImpl::unref() } // namespace activity } // namespace kernel } // namespace simgrid - -// Simcall handlers: -/** - * @brief Handles a sem acquire simcall with timeout. - */ -void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout) -{ - simcall_sem_acquire_timeout__set__result(simcall, 0); // default result, will be set to 1 on timeout - sem->acquire(simcall->issuer_, timeout); -} diff --git a/src/s4u/s4u_Semaphore.cpp b/src/s4u/s4u_Semaphore.cpp index 908378c497..4662d5d8c6 100644 --- a/src/s4u/s4u_Semaphore.cpp +++ b/src/s4u/s4u_Semaphore.cpp @@ -30,7 +30,11 @@ void Semaphore::acquire() bool Semaphore::acquire_timeout(double timeout) { - return simcall_sem_acquire_timeout(pimpl_, timeout); + kernel::actor::ActorImpl* issuer = kernel::actor::ActorImpl::self(); + mc::SemAcquireSimcall observer{issuer, pimpl_}; + kernel::actor::simcall_blocking( + [&observer] { observer.get_sem()->acquire(observer.get_issuer(), observer.get_timeout()); }, &observer); + return simgrid::simix::unmarshal(issuer->simcall_.result_); } void Semaphore::release() diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 4c049a4a34..16e7f8f3d0 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -320,10 +320,9 @@ void simcall_sem_acquire(smx_sem_t sem) // XBT_ATTRIB_DEPRECATD_v331 * @ingroup simix_synchro_management * */ -int simcall_sem_acquire_timeout(smx_sem_t sem, double timeout) +int simcall_sem_acquire_timeout(smx_sem_t sem, double timeout) // XBT_ATTRIB_DEPRECATD_v331 { - xbt_assert(std::isfinite(timeout), "timeout is not finite!"); - return simcall_BODY_sem_acquire_timeout(sem, timeout); + return sem->sem().acquire_timeout(timeout); } simgrid::kernel::activity::State simcall_io_wait(simgrid::kernel::activity::ActivityImpl* io, diff --git a/src/simix/popping_accessors.hpp b/src/simix/popping_accessors.hpp index 49484b2b1d..db744d4e1b 100644 --- a/src/simix/popping_accessors.hpp +++ b/src/simix/popping_accessors.hpp @@ -684,43 +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_sem_t simcall_sem_acquire_timeout__get__sem(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[0]); -} -static inline smx_sem_t simcall_sem_acquire_timeout__getraw__sem(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[0]); -} -static inline void simcall_sem_acquire_timeout__set__sem(smx_simcall_t simcall, smx_sem_t arg) -{ - simgrid::simix::marshal(simcall->args_[0], arg); -} -static inline double simcall_sem_acquire_timeout__get__timeout(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[1]); -} -static inline double simcall_sem_acquire_timeout__getraw__timeout(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[1]); -} -static inline void simcall_sem_acquire_timeout__set__timeout(smx_simcall_t simcall, double arg) -{ - simgrid::simix::marshal(simcall->args_[1], arg); -} -static inline int simcall_sem_acquire_timeout__get__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->result_); -} -static inline int simcall_sem_acquire_timeout__getraw__result(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->result_); -} -static inline void simcall_sem_acquire_timeout__set__result(smx_simcall_t simcall, int result) -{ - simgrid::simix::marshal(simcall->result_, result); -} - static inline std::function const* simcall_run_kernel__get__code(smx_simcall_t simcall) { return simgrid::simix::unmarshal const*>(simcall->args_[0]); @@ -758,4 +721,3 @@ 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_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 01e638fc4b..dae4e7508e 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_sem_acquire_timeout(smx_sem_t sem, double timeout) -{ - if (false) /* Go to that function to follow the code flow through the simcall barrier */ - simcall_HANDLER_sem_acquire_timeout(&SIMIX_process_self()->simcall_, sem, timeout); - return simcall(Simcall::SEM_ACQUIRE_TIMEOUT, sem, timeout); -} - inline static void simcall_BODY_run_kernel(std::function const* code) { 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 1c51894c9f..1f191642e8 100644 --- a/src/simix/popping_enum.hpp +++ b/src/simix/popping_enum.hpp @@ -30,11 +30,10 @@ enum class Simcall { COMM_TESTANY, COMM_WAITANY, COMM_WAIT, - SEM_ACQUIRE_TIMEOUT, RUN_KERNEL, RUN_BLOCKING, }; -constexpr int NUM_SIMCALLS = 13; +constexpr int NUM_SIMCALLS = 12; } // namespace simix } // namespace simgrid diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index 9fb5a7effe..5e3d98b25c 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::SEM_ACQUIRE_TIMEOUT", "Simcall::RUN_KERNEL", "Simcall::RUN_BLOCKING", }}; @@ -95,10 +94,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::SEM_ACQUIRE_TIMEOUT: - simcall_HANDLER_sem_acquire_timeout(&simcall_, simgrid::simix::unmarshal(simcall_.args_[0]), simgrid::simix::unmarshal(simcall_.args_[1])); - break; - case Simcall::RUN_KERNEL: SIMIX_run_kernel(simgrid::simix::unmarshal const*>(simcall_.args_[0])); simcall_answer(); diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index 00c3f4be12..a6274c60ba 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -46,7 +46,5 @@ 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 sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]]; - void run_kernel(std::function const* code) [[nohandler]]; void run_blocking(std::function const* code) [[block,nohandler]]; -- 2.20.1