]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/mutex.h
Drop copyright and license notices from source files
[libs/core.git] / source / core / mutex.h
index 146b982806671fba20912a88f33af04d93c65b90..050d00f808a6d42f29e8cbf14744e935bad604d4 100644 (file)
@@ -1,52 +1,76 @@
-/*
-This file is part of libmspcore
-Copyright © 2006 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-#ifndef MSP_FRAMEWORK_MUTEX_H_
-#define MSP_FRAMEWORK_MUTEX_H_
+#ifndef MSP_CORE_MUTEX_H_
+#define MSP_CORE_MUTEX_H_
 
-#include <msp/refcount.h>
-#include "types.h"
+#include "refptr.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
 {
-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
+       friend class Semaphore;
+
 private:
-       MutexHandle mutex;
+       struct Private;
 
-       friend class Semaphore;
+       Private *priv;
+
+public:
+       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();
 };
 
+/**
+Locks the mutex for te lifetime of the object.
+*/
 class MutexLock
 {
-public:
-       MutexLock(Mutex &m): mutex(m) { mutex.lock(); }
-       ~MutexLock()                  { mutex.unlock(); }
 private:
        Mutex &mutex;
 
+public:
+       MutexLock(Mutex &m, bool l = true): mutex(m) { if(l) mutex.lock(); }
+       ~MutexLock() { mutex.unlock(); }
+
+       void lock() { mutex.lock(); }
+private:
        MutexLock(const MutexLock &);
        MutexLock &operator=(const MutexLock &);
 };
 
-
+/**
+Protects a pointer with a mutex.  As long as the MutexPtr (or a copy of it)
+exists, the mutex will stay locked.
+*/
 template<typename T>
+class MutexPtr
+{
+public:
+       MutexPtr(T *d, Mutex &m): mutex(new MutexLock(m)), data(d) { }
+
+       T &operator*() const { return *data; }
+       T *operator->() const { return data; }
+       void clear() { mutex=0; data = 0; }
+private:
+       RefPtr<MutexLock> mutex;
+       T *data;
+};
+
+/*template<typename T>
 class MutexPtr: public RefCount
 {
 public:
@@ -54,7 +78,7 @@ public:
        MutexPtr(const MutexPtr<T> &p): RefCount(p), mutex(p.mutex), data(p.data) { }
        T &operator*() const { return *data; }
        T *operator->() const { return data; }
-       void clear() { decref(); data=0; }
+       void clear() { decref(); data = 0; }
        ~MutexPtr() { decref(); }
 protected:
        Mutex &mutex;
@@ -69,7 +93,7 @@ protected:
                }
                return true;
        }
-};
+};*/
 
 }