00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _pmutex_h_
00021 #define _pmutex_h_
00022
00023 #include <pclasses/pexport.h>
00024 #include <pclasses/pexception.h>
00025
00026 namespace P {
00027
00029
00040 class PCORE_EXPORT Mutex {
00041 public:
00043
00055 Mutex(const char* name = 0) throw(SyncError);
00056
00058
00064 ~Mutex() throw();
00065
00067
00079 void lock() throw(SyncError);
00080
00082
00091 bool tryLock(unsigned int timeout) throw(SyncError);
00092
00094
00100 void unlock() throw(SyncError);
00101
00103
00125 class Lock {
00126 public:
00127 inline Lock(Mutex& mutex)
00128 : m_mutex(mutex) { mutex.lock(); }
00129
00130 ~Lock()
00131 { m_mutex.unlock(); }
00132
00133 Lock& operator=(Mutex& mutex)
00134 {
00135 m_mutex.unlock();
00136 m_mutex = mutex;
00137 m_mutex.lock();
00138 return *this;
00139 }
00140
00141 private:
00142 Lock(const Lock&);
00143 Lock& operator=(const Lock&);
00144
00145 Mutex& m_mutex;
00146 };
00147
00148 private:
00149 Mutex(const Mutex&);
00150 Mutex& operator=(const Mutex&);
00151
00152 struct mutex_handle_t;
00153 mutex_handle_t* m_handle;
00154 };
00155
00156 }
00157
00158 #endif