00001 #ifndef QPID_SYS_LOCKPTR_H
00002 #define QPID_SYS_LOCKPTR_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "qpid/sys/Mutex.h"
00026 #include <boost/noncopyable.hpp>
00027
00028 namespace qpid {
00029 namespace sys {
00030
00031 class Mutex;
00032
00071 template <class T, class Lock> class LockPtr : public boost::noncopyable {
00072 public:
00073 LockPtr(volatile T* p, Lock& l) : ptr(const_cast<T*>(p)), lock(l) { lock.lock(); }
00074 LockPtr(volatile T* p, volatile Lock& l) : ptr(const_cast<T*>(p)), lock(const_cast<Lock&>(l)) { lock.lock(); }
00075 ~LockPtr() { lock.unlock(); }
00076
00077 T& operator*() { return *ptr; }
00078 T* operator->() { return ptr; }
00079
00080 private:
00081 T* ptr;
00082 Lock& lock;
00083 };
00084
00085
00086 }}
00087
00088
00089 #endif