ScopedLock.h++
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __ccxx_ScopedLock_hxx
00024 #define __ccxx_ScopedLock_hxx
00025
00026 #include <commonc++/Common.h++>
00027 #include <commonc++/Lock.h++>
00028
00029 namespace ccxx {
00030
00050 class ScopedLock
00051 {
00052 public:
00053
00057 ScopedLock(Lock& lock) throw()
00058 : _lock(lock), _once(true)
00059 {
00060 _lock.lock();
00061 }
00062
00064 ~ScopedLock() throw()
00065 {
00066 _lock.unlock();
00067 }
00068
00070 inline bool testOnce() throw()
00071 { bool f = _once; _once = false; return(f); }
00074 private:
00075
00076 Lock& _lock;
00077 bool _once;
00078
00079 CCXX_COPY_DECLS(ScopedLock);
00080 };
00081
00082 };
00083
00088 #ifdef synchronized
00089 #undef synchronized
00090 #endif
00091
00092 #if (defined CCXX_OS_WINDOWS) && (defined _MSC_VER) && (_MSC_VER < 1400)
00093
00094 #define synchronized(LOCK) \
00095 for(ccxx::ScopedLock LOCK ## _locker(LOCK); \
00096 LOCK ## _locker.testOnce();)
00097
00098 #else
00099
00100 #define synchronized(LOCK) \
00101 for(ccxx::ScopedLock \
00102 CCXX_UNIQUE_VARNAME(LOCK, __LINE__, locker)(LOCK); \
00103 CCXX_UNIQUE_VARNAME(LOCK, __LINE__, locker).testOnce();)
00104
00105 #endif
00106
00107 #endif // __ccxx_ScopedLock_hxx
00108
00109