]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/mutex.h
Refactor Mutex with pimpl
[libs/core.git] / source / core / mutex.h
index c0c26829630b9dee55bdabf885fd76a6a87ca4f5..b73913450bc2ce5e150047254af6e83a2fbb0839 100644 (file)
@@ -9,31 +9,36 @@ Distributed under the LGPL
 #define MSP_CORE_MUTEX_H_
 
 #include "refptr.h"
-#include "types.h"
 
 namespace Msp {
 
+/**
+A class for controlling mutually exclusive access to a resource.  Only one
+thread can hold a lock on the mutex at a time.
+*/
 class Mutex
 {
        friend class Semaphore;
 
 private:
-       MutexHandle mutex;
+       struct Private;
+
+       Private *priv;
 
 public:
-#ifndef WIN32
-       Mutex()       { pthread_mutex_init(&mutex, 0); }
-       int lock()    { return pthread_mutex_lock(&mutex); }
-       int trylock() { return pthread_mutex_trylock(&mutex); }
-       int unlock()  { return pthread_mutex_unlock(&mutex); }
-       ~Mutex()      { pthread_mutex_destroy(&mutex); }
-#else
-       Mutex()       { mutex = CreateMutex(0, false, 0); }
-       int lock()    { return WaitForSingleObject(mutex, INFINITE)==WAIT_OBJECT_0; }
-       int trylock() { return WaitForSingleObject(mutex, 0)==WAIT_OBJECT_0; }
-       int unlock()  { return !ReleaseMutex(mutex); }
-       ~Mutex()      { CloseHandle(mutex); }
-#endif
+       Mutex();
+       ~Mutex();
+
+       /** Locks the mutex.  If the mutex is already locked, waits until it becomes
+       available. */
+       void lock();
+
+       /** Attempts to lock the mutex.  Returns true if the lock was acquired,
+       otherwise returns false. */
+       bool trylock();
+
+       /** Unlocks the mutex. */
+       void unlock();
 };
 
 /**
@@ -48,7 +53,7 @@ public:
        MutexLock(Mutex &m, bool l = true): mutex(m) { if(l) mutex.lock(); }
        ~MutexLock() { mutex.unlock(); }
 
-       int lock() { return mutex.lock(); }
+       void lock() { mutex.lock(); }
 private:
        MutexLock(const MutexLock &);
        MutexLock &operator=(const MutexLock &);