]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/mutex.h
New system_error exception class
[libs/core.git] / source / core / mutex.h
index 99585103704d00d4bbde53edf3927975286f0898..c0c26829630b9dee55bdabf885fd76a6a87ca4f5 100644 (file)
@@ -1,18 +1,25 @@
-/*
-This file is part of libmspframework
+/* $Id$
+
+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_
 
-#include <msp/refcount.h>
+#ifndef MSP_CORE_MUTEX_H_
+#define MSP_CORE_MUTEX_H_
+
+#include "refptr.h"
 #include "types.h"
 
 namespace Msp {
 
 class Mutex
 {
+       friend class Semaphore;
+
+private:
+       MutexHandle mutex;
+
 public:
 #ifndef WIN32
        Mutex()       { pthread_mutex_init(&mutex, 0); }
@@ -21,32 +28,51 @@ public:
        int unlock()  { return pthread_mutex_unlock(&mutex); }
        ~Mutex()      { pthread_mutex_destroy(&mutex); }
 #else
-       Mutex()       { mutex=CreateMutex(0, false, 0); }
+       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
-private:
-       MutexHandle mutex;
-
-       friend class Semaphore;
 };
 
+/**
+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(); }
+
+       int lock() { return 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 +80,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 +95,7 @@ protected:
                }
                return true;
        }
-};
+};*/
 
 }