From: Gabriel Corona Date: Tue, 21 Jun 2016 07:43:11 +0000 (+0200) Subject: [s4u] Use unique_ptr in ConditionVariable (like the std:: ones) X-Git-Tag: v3_14~914^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/a88a4036e14334a7a01fc40a7d547687ba6dee38 [s4u] Use unique_ptr in ConditionVariable (like the std:: ones) --- diff --git a/examples/s4u/actions-comm/s4u_actions-comm.cpp b/examples/s4u/actions-comm/s4u_actions-comm.cpp index 360112702f..3e14881899 100644 --- a/examples/s4u/actions-comm/s4u_actions-comm.cpp +++ b/examples/s4u/actions-comm/s4u_actions-comm.cpp @@ -3,6 +3,8 @@ /* 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 + #include "simgrid/msg.h" #include "simgrid/simix.h" /* semaphores for the barrier */ #include @@ -172,13 +174,16 @@ static void action_barrier(const char *const *action) processes_arrived_sofar = 0; } ACT_DEBUG("Entering barrier: %s (%d already there)", NAME, processes_arrived_sofar); - mutex->lock(); - if (++processes_arrived_sofar == communicator_size) { - cond->notify_all(); - mutex->unlock(); - } else { - cond->wait(mutex); - mutex->unlock(); + + { + std::unique_lock lock(*mutex); + if (++processes_arrived_sofar == communicator_size) { + // We can notify without the lock: + lock.unlock(); + cond->notify_all(); + } else { + cond->wait(lock); + } } ACT_DEBUG("Exiting barrier: %s", NAME); diff --git a/include/simgrid/s4u/conditionVariable.hpp b/include/simgrid/s4u/conditionVariable.hpp index f2790166a2..9c9c58ac65 100644 --- a/include/simgrid/s4u/conditionVariable.hpp +++ b/include/simgrid/s4u/conditionVariable.hpp @@ -6,6 +6,7 @@ #ifndef SIMGRID_S4U_COND_VARIABLE_HPP #define SIMGRID_S4U_COND_VARIABLE_HPP +#include #include // std::swap #include @@ -49,8 +50,8 @@ public: /** * Wait functions */ - void wait(Mutex *mutex); - void wait_for(Mutex *mutex, double time); + void wait(std::unique_lock& lock); + void wait_for(std::unique_lock& lock, double time); /** * Notify functions diff --git a/include/simgrid/s4u/mutex.hpp b/include/simgrid/s4u/mutex.hpp index 75b7d09c03..ff60143540 100644 --- a/include/simgrid/s4u/mutex.hpp +++ b/include/simgrid/s4u/mutex.hpp @@ -6,17 +6,18 @@ #ifndef SIMGRID_S4U_MUTEX_HPP #define SIMGRID_S4U_MUTEX_HPP +#include #include #include #include #include "simgrid/simix.h" -#include namespace simgrid { namespace s4u { class ConditionVariable; + XBT_PUBLIC_CLASS Mutex { friend ConditionVariable; public: @@ -58,6 +59,7 @@ public: private: simgrid::simix::Mutex* mutex_; }; + }} // namespace simgrid::s4u #endif /* SIMGRID_S4U_MUTEX_HPP */ diff --git a/src/s4u/s4u_conditionVariable.cpp b/src/s4u/s4u_conditionVariable.cpp index 60e336548e..32c8aabdbd 100644 --- a/src/s4u/s4u_conditionVariable.cpp +++ b/src/s4u/s4u_conditionVariable.cpp @@ -1,3 +1,5 @@ +#include + #include "simgrid/s4u/conditionVariable.hpp" #include "simgrid/simix.h" @@ -14,12 +16,12 @@ s4u::ConditionVariable::~ConditionVariable() { /** * Wait functions */ -void s4u::ConditionVariable::wait(s4u::Mutex *mutex) { - simcall_cond_wait(cond_, mutex->mutex_); +void s4u::ConditionVariable::wait(std::unique_lock& lock) { + simcall_cond_wait(cond_, lock.mutex()->mutex_); } -void s4u::ConditionVariable::wait_for(s4u::Mutex *mutex, double timeout) { - simcall_cond_wait_timeout(cond_, mutex->mutex_, timeout); +void s4u::ConditionVariable::wait_for(std::unique_lock& lock, double timeout) { + simcall_cond_wait_timeout(cond_, lock.mutex()->mutex_, timeout); } /**