blocxx
RWLocker.cpp
Go to the documentation of this file.
1/*******************************************************************************
2* Copyright (C) 2005, Vintela, Inc. All rights reserved.
3* Copyright (C) 2006, Novell, Inc. All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7*
8* * Redistributions of source code must retain the above copyright notice,
9* this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of
14* Vintela, Inc.,
15* nor Novell, Inc.,
16* nor the names of its contributors or employees may be used to
17* endorse or promote products derived from this software without
18* specific prior written permission.
19*
20* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30* POSSIBILITY OF SUCH DAMAGE.
31*******************************************************************************/
32
33
37
38#include "blocxx/BLOCXX_config.h"
39#include "blocxx/RWLocker.hpp"
40#include "blocxx/ThreadImpl.hpp"
41
42namespace BLOCXX_NAMESPACE
43{
44
46
47inline bool RWLocker::ThreadComparer::operator()(Thread_t x, Thread_t y) const
48{
49#ifdef BLOCXX_NCR
50 return !ThreadImpl::sameThreads(x, y) && (cma_thread_get_unique(&x) < cma_thread_get_unique(&y));
51#else
52 return !ThreadImpl::sameThreads(x, y) && x < y;
53#endif
54}
55
60
64
65void
66RWLocker::getReadLock(UInt32 sTimeout, UInt32 usTimeout)
67{
68 getReadLock(Timeout::relative(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
69}
70
72void
74{
75 Thread_t tid = ThreadImpl::currentThread();
76 m_impl.acquireReadLock(tid, timeout);
77}
78
80void
82{
83 Thread_t tid = ThreadImpl::currentThread();
84 try
85 {
86 m_impl.releaseReadLock(tid);
87 }
89 {
90 BLOCXX_THROW_SUBEX(RWLockerException, "Cannot release a read lock when no read lock is held", e);
91 }
92}
93
95void
96RWLocker::getWriteLock(UInt32 sTimeout, UInt32 usTimeout)
97{
98 getWriteLock(Timeout::relative(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
99}
100
101void
103{
104 Thread_t tid = ThreadImpl::currentThread();
105 m_impl.acquireWriteLock(tid, timeout);
106}
107
109void
111{
112 Thread_t tid = ThreadImpl::currentThread();
113 try
114 {
115 m_impl.releaseWriteLock(tid);
116 }
118 {
119 BLOCXX_THROW_SUBEX(RWLockerException, "Cannot release a write lock when no write lock is held", e);
120 }
121}
122
123} // end namespace BLOCXX_NAMESPACE
124
#define BLOCXX_DEFINE_EXCEPTION_WITH_ID(NAME)
Define a new exception class named <NAME>Exception that derives from Exception.
#define BLOCXX_THROW_SUBEX(exType, msg, subex)
Throw an exception using FILE and LINE.
void getWriteLock(const Timeout &timeout)
Definition RWLocker.cpp:102
GenericRWLockImpl< Thread_t, ThreadComparer > m_impl
Definition RWLocker.hpp:90
void getReadLock(const Timeout &timeout)
Definition RWLocker.cpp:73
A timeout can be absolute, which means that it will happen at the specified DateTime.
Definition Timeout.hpp:56
static Timeout relative(float seconds)
Definition Timeout.cpp:58
bool sameThreads(const volatile Thread_t &handle1, const volatile Thread_t &handle2)
Check two platform dependant thread types for equality.
Taken from RFC 1321.
bool operator()(Thread_t x, Thread_t y) const
Definition RWLocker.cpp:47