|
|
@@ -38,6 +38,7 @@ public: |
|
|
|
* Constructor. |
|
|
|
*/ |
|
|
|
Mutex() noexcept |
|
|
|
: fMutex() |
|
|
|
{ |
|
|
|
pthread_mutex_init(&fMutex, nullptr); |
|
|
|
} |
|
|
@@ -92,6 +93,11 @@ public: |
|
|
|
* Constructor. |
|
|
|
*/ |
|
|
|
RecursiveMutex() noexcept |
|
|
|
#ifdef DISTRHO_OS_WINDOWS |
|
|
|
: fSection() |
|
|
|
#else |
|
|
|
: fMutex() |
|
|
|
#endif |
|
|
|
{ |
|
|
|
#ifdef DISTRHO_OS_WINDOWS |
|
|
|
InitializeCriticalSection(&fSection); |
|
|
@@ -168,16 +174,16 @@ private: |
|
|
|
// Helper class to lock&unlock a mutex during a function scope. |
|
|
|
|
|
|
|
template <class Mutex> |
|
|
|
class ScopedLocker |
|
|
|
class ScopeLocker |
|
|
|
{ |
|
|
|
public: |
|
|
|
ScopedLocker(const Mutex& mutex) noexcept |
|
|
|
ScopeLocker(const Mutex& mutex) noexcept |
|
|
|
: fMutex(mutex) |
|
|
|
{ |
|
|
|
fMutex.lock(); |
|
|
|
} |
|
|
|
|
|
|
|
~ScopedLocker() noexcept |
|
|
|
~ScopeLocker() noexcept |
|
|
|
{ |
|
|
|
fMutex.unlock(); |
|
|
|
} |
|
|
@@ -186,23 +192,58 @@ private: |
|
|
|
const Mutex& fMutex; |
|
|
|
|
|
|
|
DISTRHO_PREVENT_HEAP_ALLOCATION |
|
|
|
DISTRHO_DECLARE_NON_COPY_CLASS(ScopedLocker) |
|
|
|
DISTRHO_DECLARE_NON_COPY_CLASS(ScopeLocker) |
|
|
|
}; |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
// Helper class to try-lock&unlock a mutex during a function scope. |
|
|
|
|
|
|
|
template <class Mutex> |
|
|
|
class ScopeTryLocker |
|
|
|
{ |
|
|
|
public: |
|
|
|
ScopeTryLocker(const Mutex& mutex) noexcept |
|
|
|
: fMutex(mutex), |
|
|
|
fLocked(mutex.tryLock()) {} |
|
|
|
|
|
|
|
~ScopeTryLocker() noexcept |
|
|
|
{ |
|
|
|
if (fLocked) |
|
|
|
fMutex.unlock(); |
|
|
|
} |
|
|
|
|
|
|
|
bool wasLocked() const noexcept |
|
|
|
{ |
|
|
|
return fLocked; |
|
|
|
} |
|
|
|
|
|
|
|
bool wasNotLocked() const noexcept |
|
|
|
{ |
|
|
|
return !fLocked; |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
const Mutex& fMutex; |
|
|
|
const bool fLocked; |
|
|
|
|
|
|
|
DISTRHO_PREVENT_HEAP_ALLOCATION |
|
|
|
DISTRHO_DECLARE_NON_COPY_CLASS(ScopeTryLocker) |
|
|
|
}; |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
// Helper class to unlock&lock a mutex during a function scope. |
|
|
|
|
|
|
|
template <class Mutex> |
|
|
|
class ScopedUnlocker |
|
|
|
class ScopeUnlocker |
|
|
|
{ |
|
|
|
public: |
|
|
|
ScopedUnlocker(const Mutex& mutex) noexcept |
|
|
|
ScopeUnlocker(const Mutex& mutex) noexcept |
|
|
|
: fMutex(mutex) |
|
|
|
{ |
|
|
|
fMutex.unlock(); |
|
|
|
} |
|
|
|
|
|
|
|
~ScopedUnlocker() noexcept |
|
|
|
~ScopeUnlocker() noexcept |
|
|
|
{ |
|
|
|
fMutex.lock(); |
|
|
|
} |
|
|
@@ -211,17 +252,20 @@ private: |
|
|
|
const Mutex& fMutex; |
|
|
|
|
|
|
|
DISTRHO_PREVENT_HEAP_ALLOCATION |
|
|
|
DISTRHO_DECLARE_NON_COPY_CLASS(ScopedUnlocker) |
|
|
|
DISTRHO_DECLARE_NON_COPY_CLASS(ScopeUnlocker) |
|
|
|
}; |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
// Define types |
|
|
|
|
|
|
|
typedef ScopedLocker<Mutex> MutexLocker; |
|
|
|
typedef ScopedLocker<RecursiveMutex> RecursiveMutexLocker; |
|
|
|
typedef ScopeLocker<Mutex> MutexLocker; |
|
|
|
typedef ScopeLocker<RecursiveMutex> RecursiveMutexLocker; |
|
|
|
|
|
|
|
typedef ScopeTryLocker<Mutex> MutexTryLocker; |
|
|
|
typedef ScopeTryLocker<RecursiveMutex> RecursiveMutexTryLocker; |
|
|
|
|
|
|
|
typedef ScopedUnlocker<Mutex> MutexUnlocker; |
|
|
|
typedef ScopedUnlocker<RecursiveMutex> RecursiveMutexUnlocker; |
|
|
|
typedef ScopeUnlocker<Mutex> MutexUnlocker; |
|
|
|
typedef ScopeUnlocker<RecursiveMutex> RecursiveMutexUnlocker; |
|
|
|
|
|
|
|
// ----------------------------------------------------------------------- |
|
|
|
|
|
|
|