| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * Carla Mutex | |||
| * Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com> | |||
| * Copyright (C) 2013-2016 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU General Public License as | |||
| @@ -32,19 +32,15 @@ public: | |||
| * Constructor. | |||
| */ | |||
| CarlaMutex() noexcept | |||
| #if 0 //def CARLA_OS_WIN | |||
| : fAlreadyLocked(false), | |||
| fSection(), | |||
| #else | |||
| : fMutex(), | |||
| #endif | |||
| fTryLockWasCalled(false) | |||
| { | |||
| #if 0 //def CARLA_OS_WIN | |||
| InitializeCriticalSection(&fSection); | |||
| #else | |||
| pthread_mutex_init(&fMutex, nullptr); | |||
| #endif | |||
| pthread_mutexattr_t atts; | |||
| pthread_mutexattr_init(&atts); | |||
| pthread_mutexattr_setprotocol(&atts, PTHREAD_PRIO_INHERIT); | |||
| pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_NORMAL); | |||
| pthread_mutex_init(&fMutex, &atts); | |||
| pthread_mutexattr_destroy(&atts); | |||
| } | |||
| /* | |||
| @@ -52,11 +48,7 @@ public: | |||
| */ | |||
| ~CarlaMutex() noexcept | |||
| { | |||
| #if 0 //def CARLA_OS_WIN | |||
| DeleteCriticalSection(&fSection); | |||
| #else | |||
| pthread_mutex_destroy(&fMutex); | |||
| #endif | |||
| } | |||
| /* | |||
| @@ -74,16 +66,7 @@ public: | |||
| */ | |||
| void lock() const noexcept | |||
| { | |||
| #if 0 //def CARLA_OS_WIN | |||
| EnterCriticalSection(&fSection); | |||
| for (;fAlreadyLocked;) | |||
| Sleep(500); | |||
| fAlreadyLocked = true; | |||
| #else | |||
| pthread_mutex_lock(&fMutex); | |||
| #endif | |||
| } | |||
| /* | |||
| @@ -94,21 +77,7 @@ public: | |||
| { | |||
| fTryLockWasCalled = true; | |||
| #if 0 //def CARLA_OS_WIN | |||
| if (TryEnterCriticalSection(&fSection) == FALSE) | |||
| return false; | |||
| if (fAlreadyLocked) | |||
| { | |||
| LeaveCriticalSection(&fSection); | |||
| return false; | |||
| } | |||
| fAlreadyLocked = true; | |||
| return true; | |||
| #else | |||
| return (pthread_mutex_trylock(&fMutex) == 0); | |||
| #endif | |||
| } | |||
| /* | |||
| @@ -119,21 +88,11 @@ public: | |||
| if (resetTryLock) | |||
| fTryLockWasCalled = false; | |||
| #if 0 //def CARLA_OS_WIN | |||
| fAlreadyLocked = false; | |||
| LeaveCriticalSection(&fSection); | |||
| #else | |||
| pthread_mutex_unlock(&fMutex); | |||
| #endif | |||
| } | |||
| private: | |||
| #if 0 //def CARLA_OS_WIN | |||
| mutable volatile bool fAlreadyLocked; | |||
| mutable CRITICAL_SECTION fSection; | |||
| #else | |||
| mutable pthread_mutex_t fMutex; | |||
| #endif | |||
| mutable volatile bool fTryLockWasCalled; // true if "tryLock()" was called at least once | |||
| CARLA_PREVENT_HEAP_ALLOCATION | |||
| @@ -161,6 +120,7 @@ public: | |||
| #else | |||
| pthread_mutexattr_t atts; | |||
| pthread_mutexattr_init(&atts); | |||
| pthread_mutexattr_setprotocol(&atts, PTHREAD_PRIO_INHERIT); | |||
| pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_RECURSIVE); | |||
| pthread_mutex_init(&fMutex, &atts); | |||
| pthread_mutexattr_destroy(&atts); | |||