00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00038 #include "blocxx/BLOCXX_config.h"
00039 #include "blocxx/RWLocker.hpp"
00040 #include "blocxx/ThreadImpl.hpp"
00041
00042 namespace BLOCXX_NAMESPACE
00043 {
00044
00045 BLOCXX_DEFINE_EXCEPTION_WITH_ID(RWLocker);
00046
00047 inline bool RWLocker::ThreadComparer::operator()(Thread_t x, Thread_t y) const
00048 {
00049 #ifdef BLOCXX_NCR
00050 return !ThreadImpl::sameThreads(x, y) && (cma_thread_get_unique(&x) < cma_thread_get_unique(&y));
00051 #else
00052 return !ThreadImpl::sameThreads(x, y) && x < y;
00053 #endif
00054 }
00055
00057 RWLocker::RWLocker()
00058 {
00059 }
00061 RWLocker::~RWLocker()
00062 {
00063 }
00065 void
00066 RWLocker::getReadLock(UInt32 sTimeout, UInt32 usTimeout)
00067 {
00068 getReadLock(Timeout::relative(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
00069 }
00070
00072 void
00073 RWLocker::getReadLock(const Timeout& timeout)
00074 {
00075 Thread_t tid = ThreadImpl::currentThread();
00076 m_impl.acquireReadLock(tid, timeout);
00077 }
00078
00080 void
00081 RWLocker::releaseReadLock()
00082 {
00083 Thread_t tid = ThreadImpl::currentThread();
00084 try
00085 {
00086 m_impl.releaseReadLock(tid);
00087 }
00088 catch (GenericRWLockImplException& e)
00089 {
00090 BLOCXX_THROW_SUBEX(RWLockerException, "Cannot release a read lock when no read lock is held", e);
00091 }
00092 }
00093
00095 void
00096 RWLocker::getWriteLock(UInt32 sTimeout, UInt32 usTimeout)
00097 {
00098 getWriteLock(Timeout::relative(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
00099 }
00101 void
00102 RWLocker::getWriteLock(const Timeout& timeout)
00103 {
00104 Thread_t tid = ThreadImpl::currentThread();
00105 m_impl.acquireWriteLock(tid, timeout);
00106 }
00107
00109 void
00110 RWLocker::releaseWriteLock()
00111 {
00112 Thread_t tid = ThreadImpl::currentThread();
00113 try
00114 {
00115 m_impl.releaseWriteLock(tid);
00116 }
00117 catch (GenericRWLockImplException& e)
00118 {
00119 BLOCXX_THROW_SUBEX(RWLockerException, "Cannot release a write lock when no write lock is held", e);
00120 }
00121 }
00122
00123 }
00124