diff options
Diffstat (limited to 'src/threading')
-rw-r--r-- | src/threading/event.h | 1 | ||||
-rw-r--r-- | src/threading/mutex.cpp | 15 | ||||
-rw-r--r-- | src/threading/mutex.h | 14 | ||||
-rw-r--r-- | src/threading/mutex_auto_lock.h | 12 |
4 files changed, 40 insertions, 2 deletions
diff --git a/src/threading/event.h b/src/threading/event.h index dba3ddb4c..43f2b04be 100644 --- a/src/threading/event.h +++ b/src/threading/event.h @@ -29,6 +29,7 @@ DEALINGS IN THE SOFTWARE. #if __cplusplus >= 201103L #include <condition_variable> #include "threading/mutex.h" + #include "threading/mutex_auto_lock.h" #elif defined(_WIN32) #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp index e12b79185..f2b07bec3 100644 --- a/src/threading/mutex.cpp +++ b/src/threading/mutex.cpp @@ -34,8 +34,19 @@ DEALINGS IN THE SOFTWARE. #define UNUSED(expr) do { (void)(expr); } while (0) +Mutex::Mutex() +{ + init_mutex(false); +} + + Mutex::Mutex(bool recursive) { + init_mutex(recursive); +} + +void Mutex::init_mutex(bool recursive) +{ #ifdef _WIN32 // Windows critical sections are recursive by default UNUSED(recursive); @@ -89,5 +100,9 @@ void Mutex::unlock() #endif } +RecursiveMutex::RecursiveMutex() + : Mutex(true) +{} + #endif diff --git a/src/threading/mutex.h b/src/threading/mutex.h index 40b10a2ea..dadbd050c 100644 --- a/src/threading/mutex.h +++ b/src/threading/mutex.h @@ -30,6 +30,7 @@ DEALINGS IN THE SOFTWARE. #if __cplusplus >= 201103L && !defined(_WIN32) #include <mutex> using Mutex = std::mutex; + using RecursiveMutex = std::recursive_mutex; #else #ifdef _WIN32 @@ -49,11 +50,14 @@ DEALINGS IN THE SOFTWARE. class Mutex { public: - Mutex(bool recursive=false); + Mutex(); ~Mutex(); void lock(); void unlock(); +protected: + Mutex(bool recursive); + void init_mutex(bool recursive); private: #ifdef _WIN32 CRITICAL_SECTION mutex; @@ -64,6 +68,14 @@ private: DISABLE_CLASS_COPY(Mutex); }; +class RecursiveMutex : public Mutex +{ +public: + RecursiveMutex(); + + DISABLE_CLASS_COPY(RecursiveMutex); +}; + #endif // C++11 #endif diff --git a/src/threading/mutex_auto_lock.h b/src/threading/mutex_auto_lock.h index 1c39349e5..25caf7e14 100644 --- a/src/threading/mutex_auto_lock.h +++ b/src/threading/mutex_auto_lock.h @@ -28,7 +28,8 @@ DEALINGS IN THE SOFTWARE. #if __cplusplus >= 201103L #include <mutex> - using MutexAutoLock = std::lock_guard<std::mutex>; + using MutexAutoLock = std::unique_lock<std::mutex>; + using RecursiveMutexAutoLock = std::unique_lock<std::recursive_mutex>; #else #include "threading/mutex.h" @@ -44,6 +45,15 @@ private: Mutex &mutex; }; +class RecursiveMutexAutoLock +{ +public: + RecursiveMutexAutoLock(RecursiveMutex &m) : mutex(m) { mutex.lock(); } + ~RecursiveMutexAutoLock() { mutex.unlock(); } + +private: + RecursiveMutex &mutex; +}; #endif #endif |