cel_rwlock.h

Go to the documentation of this file.
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_

This document is automatically generated using doxygen 1.5.4 at Fri Jun 27 18:21:54 2008.