From 87c7bce04950b4901fd88343fb966f5ff30d4c0e Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 23 Jan 2016 23:06:13 +0100 Subject: Possible fix to missing std::mutex in mingw. --- src/mutex.cc | 105 +++++++++++++++++------------------------------------------ src/mutex.h | 13 +++----- 2 files changed, 34 insertions(+), 84 deletions(-) diff --git a/src/mutex.cc b/src/mutex.cc index 22d59a6..75c7dad 100644 --- a/src/mutex.cc +++ b/src/mutex.cc @@ -35,121 +35,74 @@ struct mutex_private_t { #ifdef WIN32 - HANDLE mutex; + HANDLE mutex; #else - pthread_mutex_t mutex; + pthread_mutex_t mutex; #endif }; Mutex::Mutex() { - prv = new struct mutex_private_t(); + prv = new struct mutex_private_t(); #ifdef WIN32 - prv->mutex = CreateMutex(NULL, // default security attributes - FALSE, // initially not owned - NULL); // unnamed mutex + prv->mutex = CreateMutex(nullptr, // default security attributes + FALSE, // initially not owned + nullptr); // unnamed mutex #else - pthread_mutex_init (&prv->mutex, NULL); + pthread_mutex_init (&prv->mutex, nullptr); #endif } Mutex::~Mutex() { #ifdef WIN32 - CloseHandle(prv->mutex); + CloseHandle(prv->mutex); #else - pthread_mutex_destroy(&prv->mutex); + pthread_mutex_destroy(&prv->mutex); #endif - if(prv) delete prv; + if(prv) + { + delete prv; + } } void Mutex::lock() { #ifdef WIN32 - WaitForSingleObject(prv->mutex, // handle to mutex - INFINITE); // no time-out interval + WaitForSingleObject(prv->mutex, // handle to mutex + INFINITE); // no time-out interval #else - pthread_mutex_lock(&prv->mutex); + pthread_mutex_lock(&prv->mutex); #endif } void Mutex::unlock() { #ifdef WIN32 - ReleaseMutex(prv->mutex); + ReleaseMutex(prv->mutex); #else - pthread_mutex_unlock(&prv->mutex); + pthread_mutex_unlock(&prv->mutex); #endif } -MutexAutolock::MutexAutolock(Mutex &m) - : mutex(m) +#ifdef WIN32 +// Hack: mingw doesn't have std::mutex +namespace std { +bool mutex::try_lock() { - mutex.lock(); + return Mutex::trylock(); } - -MutexAutolock::~MutexAutolock() -{ - mutex.unlock(); } +#endif -#ifdef TEST_MUTEX -//deps: -//cflags: $(PTHREAD_CFLAGS) -//libs: $(PTHREAD_LIBS) -#include - -#include - -volatile int cnt = 0; - -static void* thread_run(void *data) +MutexAutolock::MutexAutolock(Mutex &m) + : mutex(m) { - Mutex *mutex = (Mutex*)data; - mutex->lock(); - cnt++; - mutex->unlock(); - return NULL; + mutex.lock(); } -TEST_BEGIN; - -Mutex mutex; - -mutex.lock(); -TEST_FALSE(mutex.trylock(), "Testing if trylock works negative."); -mutex.unlock(); -TEST_TRUE(mutex.trylock(), "Testing if trylock works positive."); -mutex.unlock(); - -mutex.lock(); - -pthread_attr_t attr; -pthread_t tid; -pthread_attr_init(&attr); -pthread_create(&tid, &attr, thread_run, &mutex); - -sleep(1); -TEST_EQUAL_INT(cnt, 0, "Testing if lock prevent cnt from increasing."); -mutex.unlock(); - -sleep(1); -TEST_EQUAL_INT(cnt, 1, "Testing if unlock makes cnt increase."); - -pthread_join(tid, NULL); -pthread_attr_destroy(&attr); - +MutexAutolock::~MutexAutolock() { - TEST_TRUE(mutex.trylock(), "Testing if autolock has not yet locked the mutex."); - mutex.unlock(); - MutexAutolock mlock(mutex); - TEST_FALSE(mutex.trylock(), "Testing if autolock worked."); + mutex.unlock(); } - -TEST_TRUE(mutex.trylock(), "Testing if autolock has released the lock on the mutex."); -mutex.unlock(); - -TEST_END; - -#endif/*TEST_MUTEX*/ diff --git a/src/mutex.h b/src/mutex.h index 92c9f53..8c71733 100644 --- a/src/mutex.h +++ b/src/mutex.h @@ -45,14 +45,11 @@ private: #ifdef WIN32 // Hack: mingw doesn't have std::mutex namespace std { - class mutex - : public Mutex { -// public: -// bool try_lock() -// { -// return trylock(); -// } - }; +class mutex + : public Mutex { +public: + bool try_lock(); +}; } #endif -- cgit v1.2.3