00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _pcriticalsection_h_
00021 #define _pcriticalsection_h_
00022
00023 #include <pclasses/pexport.h>
00024
00025 namespace P {
00026
00028
00036 class PCORE_EXPORT CriticalSection {
00037 public:
00039 CriticalSection() throw();
00040
00042 ~CriticalSection() throw();
00043
00045
00050 void lock() throw();
00051
00053 bool tryLock() throw();
00054
00056 void unlock() throw();
00057
00059
00081 class Lock {
00082 public:
00083 inline Lock(CriticalSection& cs)
00084 : m_cs(cs) { cs.lock(); }
00085
00086 ~Lock()
00087 { m_cs.unlock(); }
00088
00089 Lock& operator=(CriticalSection& cs)
00090 {
00091 m_cs.unlock();
00092 m_cs = cs;
00093 m_cs.lock();
00094 return *this;
00095 }
00096
00097 private:
00098 Lock(const Lock&);
00099 Lock& operator=(const Lock&);
00100
00101 CriticalSection& m_cs;
00102 };
00103
00104 private:
00105 CriticalSection(const CriticalSection&);
00106 CriticalSection& operator=(const CriticalSection&);
00107
00108 struct cs_handle_t;
00109 cs_handle_t* m_handle;
00110 };
00111
00112 }
00113
00114 #endif