]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/mutex.h
Make sure all classes have sensible copy semantics
[libs/core.git] / source / core / mutex.h
index 050d00f808a6d42f29e8cbf14744e935bad604d4..3d3dc84dd3bca28e65c0ea770b00cc6851b6f552 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef MSP_CORE_MUTEX_H_
 #define MSP_CORE_MUTEX_H_
 
+#include "noncopyable.h"
 #include "refptr.h"
 
 namespace Msp {
@@ -9,7 +10,7 @@ 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
+class Mutex: private NonCopyable
 {
        friend class Semaphore;
 
@@ -35,21 +36,19 @@ public:
 };
 
 /**
-Locks the mutex for te lifetime of the object.
+Locks the mutex for the lifetime of the object.
 */
 class MutexLock
 {
 private:
        Mutex &mutex;
 
+       MutexLock(const MutexLock &);
 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 &);
 };
 
 /**
@@ -59,41 +58,17 @@ 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:
-       MutexPtr(T *d, Mutex &m): mutex(m), data(d) { mutex.lock(); }
-       MutexPtr(const MutexPtr<T> &p): RefCount(p), mutex(p.mutex), data(p.data) { }
+       MutexPtr(T *d, Mutex &m): mutex(new MutexLock(m)), data(d) { }
+
        T &operator*() const { return *data; }
        T *operator->() const { return data; }
-       void clear() { decref(); data = 0; }
-       ~MutexPtr() { decref(); }
-protected:
-       Mutex &mutex;
-       T     *data;
-
-       bool decref()
-       {
-               if(!RefCount::decref())
-               {
-                       mutex.unlock();
-                       return false;
-               }
-               return true;
-       }
-};*/
+       void clear() { mutex = 0; data = 0; }
+};
 
 }