From: Arnaud Giersch Date: Sat, 13 Mar 2021 21:25:04 +0000 (+0100) Subject: Modernize simcall sem_acquire. X-Git-Tag: v3.27~153^2~3 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/5954596b70db131a1a1ce5d8580ba32687066e34 Modernize simcall sem_acquire. --- diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index b7efc34dfd..87bdc50b20 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -207,7 +207,7 @@ XBT_ATTRIB_DEPRECATED_v330("Please use sg_cond_init()") XBT_PUBLIC smx_cond_t si 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_PUBLIC void simcall_sem_acquire(smx_sem_t sem); +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); SG_END_DECL diff --git a/src/kernel/activity/SemaphoreImpl.cpp b/src/kernel/activity/SemaphoreImpl.cpp index fbfffa1cf7..ec75b827bd 100644 --- a/src/kernel/activity/SemaphoreImpl.cpp +++ b/src/kernel/activity/SemaphoreImpl.cpp @@ -61,14 +61,6 @@ void SemaphoreImpl::unref() } // 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) -{ - sem->acquire(simcall->issuer_, -1); -} - /** * @brief Handles a sem acquire simcall with timeout. */ diff --git a/src/mc/checker/SimcallObserver.cpp b/src/mc/checker/SimcallObserver.cpp index 3b7854c207..3dd9d0e747 100644 --- a/src/mc/checker/SimcallObserver.cpp +++ b/src/mc/checker/SimcallObserver.cpp @@ -75,5 +75,25 @@ bool MutexLockSimcall::is_enabled() const { return not blocking_ || mutex_->get_owner() == nullptr || mutex_->get_owner() == get_issuer(); } + +std::string SemAcquireSimcall::to_string(int time_considered) const +{ + return SimcallObserver::to_string(time_considered) + "Sem ACQUIRE"; +} + +std::string SemAcquireSimcall::dot_label() const +{ + return SimcallObserver::dot_label() + "Sem ACQUIRE"; +} + +bool SemAcquireSimcall::is_enabled() const +{ + static bool warned = false; + if (not warned) { + XBT_INFO("Using semaphore in model-checked code is still experimental. Use at your own risk"); + warned = true; + } + return true; +} } // namespace mc } // namespace simgrid diff --git a/src/mc/checker/SimcallObserver.hpp b/src/mc/checker/SimcallObserver.hpp index 70efba4c6a..2dec9072cd 100644 --- a/src/mc/checker/SimcallObserver.hpp +++ b/src/mc/checker/SimcallObserver.hpp @@ -88,6 +88,18 @@ public: std::string dot_label() const override; kernel::activity::MutexImpl* get_mutex() const { return mutex_; } }; + +class SemAcquireSimcall : public SimcallObserver { + kernel::activity::SemaphoreImpl* const sem_; + +public: + SemAcquireSimcall(smx_actor_t actor, kernel::activity::SemaphoreImpl* sem) : SimcallObserver(actor), sem_(sem) {} + bool is_enabled() const override; + bool is_visible() const override { return false; } + std::string to_string(int times_considered) const override; + std::string dot_label() const override; + kernel::activity::SemaphoreImpl* get_sem() const { return sem_; } +}; } // namespace mc } // namespace simgrid diff --git a/src/mc/mc_base.cpp b/src/mc/mc_base.cpp index d678be44ff..546b67e06b 100644 --- a/src/mc/mc_base.cpp +++ b/src/mc/mc_base.cpp @@ -125,14 +125,6 @@ bool actor_is_enabled(smx_actor_t actor) return false; } - case Simcall::SEM_ACQUIRE: { - static bool warned = false; - if (not warned) - XBT_INFO("Using semaphore in model-checked code is still experimental. Use at your own risk"); - warned = true; - return true; - } - case Simcall::COND_WAIT: { static bool warned = false; if (not warned) diff --git a/src/s4u/s4u_Semaphore.cpp b/src/s4u/s4u_Semaphore.cpp index b2482eda54..908378c497 100644 --- a/src/s4u/s4u_Semaphore.cpp +++ b/src/s4u/s4u_Semaphore.cpp @@ -9,6 +9,7 @@ #include "simgrid/forward.h" #include "simgrid/s4u/Semaphore.hpp" #include "src/kernel/activity/SemaphoreImpl.hpp" +#include "src/mc/checker/SimcallObserver.hpp" namespace simgrid { namespace s4u { @@ -21,7 +22,10 @@ SemaphorePtr Semaphore::create(unsigned int initial_capacity) void Semaphore::acquire() { - simcall_sem_acquire(pimpl_); + 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(), -1.0); }, + &observer); } bool Semaphore::acquire_timeout(double timeout) diff --git a/src/simix/libsmx.cpp b/src/simix/libsmx.cpp index 2e8c87d683..cd8b9dfbdd 100644 --- a/src/simix/libsmx.cpp +++ b/src/simix/libsmx.cpp @@ -18,6 +18,7 @@ #include "src/kernel/activity/IoImpl.hpp" #include "src/kernel/activity/MailboxImpl.hpp" #include "src/kernel/activity/MutexImpl.hpp" +#include "src/kernel/activity/SemaphoreImpl.hpp" #include "src/mc/checker/SimcallObserver.hpp" #include "src/mc/mc_replay.hpp" #include "src/plugins/vm/VirtualMachineImpl.hpp" @@ -310,9 +311,9 @@ int simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout * @ingroup simix_synchro_management * */ -void simcall_sem_acquire(smx_sem_t sem) +void simcall_sem_acquire(smx_sem_t sem) // XBT_ATTRIB_DEPRECATD_v331 { - simcall_BODY_sem_acquire(sem); + return sem->sem().acquire(); } /** diff --git a/src/simix/popping_accessors.hpp b/src/simix/popping_accessors.hpp index 091a7cca07..6ee3f889fd 100644 --- a/src/simix/popping_accessors.hpp +++ b/src/simix/popping_accessors.hpp @@ -758,19 +758,6 @@ static inline void simcall_cond_wait_timeout__set__result(smx_simcall_t simcall, simgrid::simix::marshal(simcall->result_, result); } -static inline smx_sem_t simcall_sem_acquire__get__sem(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal(simcall->args_[0]); -} -static inline smx_sem_t simcall_sem_acquire__getraw__sem(smx_simcall_t simcall) -{ - return simgrid::simix::unmarshal_raw(simcall->args_[0]); -} -static inline void simcall_sem_acquire__set__sem(smx_simcall_t simcall, smx_sem_t arg) -{ - simgrid::simix::marshal(simcall->args_[0], arg); -} - static inline smx_sem_t simcall_sem_acquire_timeout__get__sem(smx_simcall_t simcall) { return simgrid::simix::unmarshal(simcall->args_[0]); @@ -847,5 +834,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_cond_wait(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex); 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(smx_simcall_t simcall, smx_sem_t sem); 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 fc04c38c1c..9f69d93511 100644 --- a/src/simix/popping_bodies.cpp +++ b/src/simix/popping_bodies.cpp @@ -118,13 +118,6 @@ inline static int simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mu return simcall(Simcall::COND_WAIT_TIMEOUT, cond, mutex, timeout); } -inline static void simcall_BODY_sem_acquire(smx_sem_t sem) -{ - if (false) /* Go to that function to follow the code flow through the simcall barrier */ - simcall_HANDLER_sem_acquire(&SIMIX_process_self()->simcall_, sem); - return simcall(Simcall::SEM_ACQUIRE, sem); -} - 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 5e21f81bfb..050d04c7e4 100644 --- a/src/simix/popping_enum.hpp +++ b/src/simix/popping_enum.hpp @@ -32,12 +32,11 @@ enum class Simcall { COMM_TESTANY, COND_WAIT, COND_WAIT_TIMEOUT, - SEM_ACQUIRE, SEM_ACQUIRE_TIMEOUT, RUN_KERNEL, RUN_BLOCKING, }; -constexpr int NUM_SIMCALLS = 16; +constexpr int NUM_SIMCALLS = 15; } // namespace simix } // namespace simgrid diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index 8f47b97cd5..b3f1b8ae50 100644 --- a/src/simix/popping_generated.cpp +++ b/src/simix/popping_generated.cpp @@ -40,7 +40,6 @@ constexpr std::array simcall_names{{ "Simcall::COMM_TESTANY", "Simcall::COND_WAIT", "Simcall::COND_WAIT_TIMEOUT", - "Simcall::SEM_ACQUIRE", "Simcall::SEM_ACQUIRE_TIMEOUT", "Simcall::RUN_KERNEL", "Simcall::RUN_BLOCKING", @@ -106,10 +105,6 @@ void simgrid::kernel::actor::ActorImpl::simcall_handle(int times_considered_) 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: - simcall_HANDLER_sem_acquire(&simcall_, simgrid::simix::unmarshal(simcall_.args_[0])); - 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 d83300b0b8..6ea13d2f23 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -49,7 +49,6 @@ int comm_testany(simgrid::kernel::activity::CommImpl** comms, size_t void cond_wait(smx_cond_t cond, smx_mutex_t mutex) [[block]]; int cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) [[block]]; -void sem_acquire(smx_sem_t sem) [[block]]; int sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]]; void run_kernel(std::function const* code) [[nohandler]];