diff --git a/include/mutex.hpp b/include/mutex.hpp index 1955b028..3d37a761 100644 --- a/include/mutex.hpp +++ b/include/mutex.hpp @@ -7,8 +7,11 @@ namespace rack { /** Allows multiple "reader" threads to obtain a lock simultaneously, but only one "writer" thread. + This implementation is currently just a wrapper for pthreads, which works on Linux/Mac/. This is available in C++17 as std::shared_mutex, but unfortunately we're using C++11. + +Locking should be avoided in real-time audio threads. */ struct SharedMutex { pthread_rwlock_t rwlock; @@ -22,12 +25,12 @@ struct SharedMutex { } void lock() { - if (pthread_rwlock_rdlock(&rwlock)) - throw Exception("pthread_rwlock_rdlock failed"); + if (pthread_rwlock_wrlock(&rwlock)) + throw Exception("pthread_rwlock_wrlock failed"); } /** Returns whether the lock was acquired. */ bool try_lock() { - return pthread_rwlock_tryrdlock(&rwlock) == 0; + return pthread_rwlock_trywrlock(&rwlock) == 0; } void unlock() { if (pthread_rwlock_unlock(&rwlock)) @@ -35,16 +38,15 @@ struct SharedMutex { } void lock_shared() { - if (pthread_rwlock_wrlock(&rwlock)) - throw Exception("pthread_rwlock_wrlock failed"); + if (pthread_rwlock_rdlock(&rwlock)) + throw Exception("pthread_rwlock_rdlock failed"); } /** Returns whether the lock was acquired. */ bool try_lock_shared() { - return pthread_rwlock_trywrlock(&rwlock) == 0; + return pthread_rwlock_tryrdlock(&rwlock) == 0; } void unlock_shared() { - if (pthread_rwlock_unlock(&rwlock)) - throw Exception("pthread_rwlock_unlock failed"); + unlock(); } };