X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2ca35a707044d033c33cb4f016e6ffddfded0d05..783573d576fa9ac43c007c6031bce185d882f92b:/include/simgrid/s4u/Mutex.hpp diff --git a/include/simgrid/s4u/Mutex.hpp b/include/simgrid/s4u/Mutex.hpp index 241ae36f91..0d1f2277a0 100644 --- a/include/simgrid/s4u/Mutex.hpp +++ b/include/simgrid/s4u/Mutex.hpp @@ -19,14 +19,27 @@ namespace s4u { class ConditionVariable; +/** @brief A classical mutex, but blocking in the simulation world + * @ingroup s4u_api + * + * It is strictly impossible to use a real mutex, such as + * [std::mutex](http://en.cppreference.com/w/cpp/thread/mutex) + * or [pthread_mutex_t](http://pubs.opengroup.org/onlinepubs/007908775/xsh/pthread_mutex_lock.html), + * because it would block the whole simulation. + * Instead, you should use the present class, that is a drop-in replacement of + * [std::mutex](http://en.cppreference.com/w/cpp/thread/mutex). + * + * As for any S4U object, Mutexes are using the @ref "RAII idiom" s4u_raii for memory management. + * Use createMutex() to get a ::MutexPtr to a newly created mutex and only manipulate ::MutexPtr. + * + */ XBT_PUBLIC_CLASS Mutex { -friend ConditionVariable; -private: - friend simgrid::simix::Mutex; - simgrid::simix::Mutex* mutex_; - Mutex(simgrid::simix::Mutex* mutex) : mutex_(mutex) {} -public: + friend ConditionVariable; + friend simgrid::simix::MutexImpl; + simgrid::simix::MutexImpl* mutex_; + explicit Mutex(simgrid::simix::MutexImpl * mutex) : mutex_(mutex) {} + /* refcounting of the intrusive_ptr is delegated to the implementation object */ friend void intrusive_ptr_add_ref(Mutex* mutex) { xbt_assert(mutex); @@ -37,15 +50,18 @@ public: xbt_assert(mutex); SIMIX_mutex_unref(mutex->mutex_); } +public: using Ptr = boost::intrusive_ptr; // No copy: + /** You cannot create a new mutex by copying an existing one. Use MutexPtr instead */ Mutex(Mutex const&) = delete; + /** You cannot create a new mutex by value assignment either. Use MutexPtr instead */ Mutex& operator=(Mutex const&) = delete; + /** Constructs a new mutex */ static Ptr createMutex(); -public: void lock(); void unlock(); bool try_lock();