ScopedReadWriteLock.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_ScopedReadWriteLock_hxx
00024 #define __ccxx_ScopedReadWriteLock_hxx
00025
00026 #include <commonc++/Common.h++>
00027 #include <commonc++/ReadWriteLock.h++>
00028
00029 namespace ccxx {
00030
00050 class ScopedReadLock
00051 {
00052 public:
00053
00058 ScopedReadLock(ReadWriteLock& rwlock) throw()
00059 : _rwlock(rwlock), _once(false)
00060 {
00061 _rwlock.lockRead();
00062 }
00063
00067 ~ScopedReadLock() throw()
00068 {
00069 _rwlock.unlock();
00070 }
00071
00073 inline bool testOnce() throw()
00074 { bool f = _once; _once = false; return(f); }
00077 private:
00078
00079 ReadWriteLock& _rwlock;
00080 bool _once;
00081
00082 CCXX_COPY_DECLS(ScopedReadLock);
00083 };
00084
00104 class ScopedWriteLock
00105 {
00106 public:
00107
00111 ScopedWriteLock(ReadWriteLock& rwlock) throw()
00112 : _rwlock(rwlock), _once(true)
00113 {
00114 _rwlock.lockWrite();
00115 }
00116
00118 ~ScopedWriteLock() throw()
00119 {
00120 _rwlock.unlock();
00121 }
00122
00124 inline bool testOnce() throw()
00125 { bool f = _once; _once = false; return(f); }
00128 private:
00129
00130 ReadWriteLock& _rwlock;
00131 bool _once;
00132
00133 CCXX_COPY_DECLS(ScopedWriteLock);
00134 };
00135
00136 };
00137
00142 #if (defined CCXX_OS_WINDOWS) && (defined _MSC_VER) && (_MSC_VER < 1400)
00143
00144 #define synchronized_read(LOCK) \
00145 for(commoncpp::ScopedReadLock LOCK ## _locker(LOCK); \
00146 LOCK ## _locker.testOnce();)
00147
00148 #else
00149
00150 #define synchronized_read(LOCK) \
00151 for(commoncpp::ScopedReadLock \
00152 CCXX_OS_UNIQUE_VARNAME(LOCK, __LINE__, locker)(LOCK); \
00153 CCXX_OS_UNIQUE_VARNAME(LOCK, __LINE__, locker).testOnce();)
00154
00155 #endif
00156
00161 #if (defined CCXX_OS_WINDOWS) && (defined _MSC_VER) && (_MSC_VER < 1400)
00162
00163 #define synchronized_write(LOCK) \
00164 for(commoncpp::ScopedWriteLock LOCK ## _locker(LOCK); \
00165 LOCK ## _locker.testOnce();)
00166
00167 #else
00168
00169 #define synchronized_write(LOCK) \
00170 for(commoncpp::ScopedWriteLock \
00171 CCXX_OS_UNIQUE_VARNAME(LOCK, __LINE__, locker)(LOCK); \
00172 CCXX_OS_UNIQUE_VARNAME(LOCK, __LINE__, locker).testOnce();)
00173
00174 #endif
00175
00176 #endif // __ccxx_ScopedReadWriteLock_hxx
00177
00178