]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/mutex.h
Assimilate exceptions and RefPtr from mspmisc
[libs/core.git] / source / core / mutex.h
index 146b982806671fba20912a88f33af04d93c65b90..8088a2839dbd21a15b8567f3768e850d5c5bb583 100644 (file)
@@ -1,12 +1,13 @@
-/*
+/* $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_
+#ifndef MSP_CORE_MUTEX_H_
+#define MSP_CORE_MUTEX_H_
 
-#include <msp/refcount.h>
+#include "refptr.h"
 #include "types.h"
 
 namespace Msp {
@@ -33,11 +34,16 @@ private:
        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(); }
+       MutexLock(Mutex &m, bool l=true): mutex(m) { if(l) mutex.lock(); }
+       ~MutexLock() { mutex.unlock(); }
+
+       int lock() { return mutex.lock(); }
 private:
        Mutex &mutex;
 
@@ -45,8 +51,25 @@ private:
        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:
@@ -69,7 +92,7 @@ protected:
                }
                return true;
        }
-};
+};*/
 
 }