summaryrefslogtreecommitdiff
path: root/src/mutex.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mutex.cc')
-rw-r--r--src/mutex.cc120
1 files changed, 42 insertions, 78 deletions
diff --git a/src/mutex.cc b/src/mutex.cc
index 22d59a6..dfdab33 100644
--- a/src/mutex.cc
+++ b/src/mutex.cc
@@ -27,129 +27,93 @@
*/
#include "mutex.h"
+#include <hugin.hpp>
+
#ifdef WIN32
#include <windows.h>
#else
#include <pthread.h>
+#include <errno.h>
#endif
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;
+ }
+}
+
+//! \return true if the function succeeds in locking the mutex for the thread.
+//! false otherwise.
+bool Mutex::try_lock()
+{
+#ifdef WIN32
+ DEBUG(mutex, "%s\n", __PRETTY_FUNCTION__);
+
+ DWORD result = WaitForSingleObject(prv->mutex, 0);
+
+ DEBUG(mutex, "WAIT_OBJECT_0: %lu, WAIT_TIMEOUT: %lu, result: %lu\n",
+ WAIT_OBJECT_0, WAIT_TIMEOUT, result);
+
+ return result != WAIT_TIMEOUT;
+#else
+ return pthread_mutex_trylock(&prv->mutex) != EBUSY;
+#endif
}
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)
+ : mutex(m)
{
- mutex.lock();
+ mutex.lock();
}
MutexAutolock::~MutexAutolock()
{
- mutex.unlock();
-}
-
-#ifdef TEST_MUTEX
-//deps:
-//cflags: $(PTHREAD_CFLAGS)
-//libs: $(PTHREAD_LIBS)
-#include <test.h>
-
-#include <unistd.h>
-
-volatile int cnt = 0;
-
-static void* thread_run(void *data)
-{
- Mutex *mutex = (Mutex*)data;
- mutex->lock();
- cnt++;
- mutex->unlock();
- return NULL;
+ mutex.unlock();
}
-
-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);
-
-{
- 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.");
-}
-
-TEST_TRUE(mutex.trylock(), "Testing if autolock has released the lock on the mutex.");
-mutex.unlock();
-
-TEST_END;
-
-#endif/*TEST_MUTEX*/