00001 //---------------------------------------------------------------------------- 00004 // 00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved. 00006 //---------------------------------------------------------------------------- 00007 00008 #ifndef _cel_rwlock_h_ 00009 #define _cel_rwlock_h_ 00010 00011 #include "cel_types.h" 00012 00013 namespace Celartem 00014 { 00015 //------------------------------------------------------------------------ 00020 class _rwlock_ 00021 { 00022 public: 00023 static _rwlock_ *create(); 00024 virtual ~_rwlock_() {} 00025 00026 virtual void lockForRead() = 0; 00027 virtual void lockForWrite() = 0; 00028 virtual void unlock() = 0; 00029 }; 00030 00031 //------------------------------------------------------------------------ 00064 class ReaderWriterLock 00065 { 00066 public: 00070 ReaderWriterLock() 00071 : m_rwlock(_rwlock_::create()) 00072 { 00073 } 00074 00078 ~ReaderWriterLock() 00079 { 00080 delete m_rwlock; 00081 } 00082 00086 inline void lockForRead() 00087 { 00088 m_rwlock->lockForRead(); 00089 } 00090 00094 inline void lockForWrite() 00095 { 00096 m_rwlock->lockForWrite(); 00097 } 00098 00102 inline void unlock() 00103 { 00104 m_rwlock->unlock(); 00105 } 00106 00107 private: 00108 _rwlock_ *m_rwlock; 00109 }; 00110 00111 //------------------------------------------------------------------------ 00116 class RWLock 00117 { 00118 public: 00122 RWLock() : m_lock(NULL) {} 00123 00132 RWLock(ReaderWriterLock& rwlock, bool writeLock = false) : m_lock(NULL) 00133 { 00134 lock(rwlock, writeLock); 00135 } 00136 00145 RWLock(RWLock& rl) : m_lock(NULL) 00146 { 00147 lock(*rl.m_lock, rl.m_writeLock); 00148 } 00149 00151 RWLock& operator=(RWLock& rl) 00152 { 00153 lock(*rl.m_lock, rl.m_writeLock); 00154 return *this; 00155 } 00156 00160 virtual ~RWLock() 00161 { 00162 unlock(); 00163 } 00164 00172 void lock(ReaderWriterLock& rwlock, bool writeLock = false) 00173 { 00174 unlock(); 00175 m_lock = &rwlock; 00176 if(m_lock) 00177 { 00178 if(writeLock) 00179 m_lock->lockForWrite(); 00180 else 00181 m_lock->lockForRead(); 00182 m_writeLock = writeLock; 00183 } 00184 } 00185 00189 void unlock() 00190 { 00191 if(m_lock) 00192 { 00193 m_lock->unlock(); 00194 m_lock = NULL; 00195 } 00196 } 00197 00203 void swap(RWLock& r) 00204 { 00205 ReaderWriterLock *tmp = m_lock; 00206 m_lock = r.m_lock; 00207 r.m_lock = tmp; 00208 bool t = m_writeLock; 00209 m_writeLock = r.m_writeLock; 00210 r.m_writeLock = t; 00211 } 00212 00213 private: 00214 ReaderWriterLock *m_lock; 00215 bool m_writeLock; 00216 }; 00217 00218 //------------------------------------------------------------------------ 00223 template<bool isWriter> class ReaderWriterLockLockerTempl 00224 { 00225 public: 00229 ReaderWriterLockLockerTempl() : m_lock(NULL) {} 00230 00237 ReaderWriterLockLockerTempl(ReaderWriterLock& rwlock) : m_lock(NULL) 00238 { 00239 lock(rwlock); 00240 } 00241 00250 ReaderWriterLockLockerTempl(ReaderWriterLockLockerTempl& rl) : m_lock(NULL) 00251 { 00252 lock(*rl.m_lock); 00253 } 00254 00256 ReaderWriterLockLockerTempl& operator=(ReaderWriterLockLockerTempl& rl) 00257 { 00258 lock(*rl.m_lock); 00259 return *this; 00260 } 00261 00265 virtual ~ReaderWriterLockLockerTempl() 00266 { 00267 unlock(); 00268 } 00269 00275 void lock(ReaderWriterLock& rwlock) 00276 { 00277 unlock(); 00278 m_lock = &rwlock; 00279 if(m_lock) 00280 { 00281 if(isWriter) 00282 m_lock->lockForWrite(); 00283 else 00284 m_lock->lockForRead(); 00285 } 00286 } 00287 00291 void unlock() 00292 { 00293 if(m_lock) 00294 { 00295 m_lock->unlock(); 00296 m_lock = NULL; 00297 } 00298 } 00299 00306 void swap(ReaderWriterLockLockerTempl& r) 00307 { 00308 ReaderWriterLock *tmp = m_lock; 00309 m_lock = r.m_lock; 00310 r.m_lock = tmp; 00311 } 00312 00313 private: 00314 ReaderWriterLock *m_lock; 00315 }; 00316 00320 typedef ReaderWriterLockLockerTempl<true> WriterLock; 00321 00325 typedef ReaderWriterLockLockerTempl<false> ReaderLock; 00326 00327 } // namespace Celartem 00328 00329 #endif // _cel_rwlock_h_