blocxx
Main Page
Namespaces
Classes
Files
File List
File Members
src
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
38
#include "blocxx/BLOCXX_config.h"
39
#include "
blocxx/RWLocker.hpp
"
40
#include "
blocxx/ThreadImpl.hpp
"
41
42
namespace
BLOCXX_NAMESPACE
43
{
44
45
BLOCXX_DEFINE_EXCEPTION_WITH_ID
(
RWLocker
);
46
47
inline
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
57
RWLocker::RWLocker
()
58
{
59
}
61
RWLocker::~RWLocker
()
62
{
63
}
65
void
66
RWLocker::getReadLock
(UInt32 sTimeout, UInt32 usTimeout)
67
{
68
getReadLock
(
Timeout::relative
(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
69
}
70
72
void
73
RWLocker::getReadLock
(
const
Timeout
& timeout)
74
{
75
Thread_t tid =
ThreadImpl::currentThread
();
76
m_impl
.
acquireReadLock
(tid, timeout);
77
}
78
80
void
81
RWLocker::releaseReadLock
()
82
{
83
Thread_t tid =
ThreadImpl::currentThread
();
84
try
85
{
86
m_impl
.
releaseReadLock
(tid);
87
}
88
catch
(
GenericRWLockImplException
& e)
89
{
90
BLOCXX_THROW_SUBEX
(
RWLockerException
,
"Cannot release a read lock when no read lock is held"
, e);
91
}
92
}
93
95
void
96
RWLocker::getWriteLock
(UInt32 sTimeout, UInt32 usTimeout)
97
{
98
getWriteLock
(
Timeout::relative
(sTimeout + static_cast<float>(usTimeout) * 1000000.0));
99
}
101
void
102
RWLocker::getWriteLock
(
const
Timeout
& timeout)
103
{
104
Thread_t tid =
ThreadImpl::currentThread
();
105
m_impl
.
acquireWriteLock
(tid, timeout);
106
}
107
109
void
110
RWLocker::releaseWriteLock
()
111
{
112
Thread_t tid =
ThreadImpl::currentThread
();
113
try
114
{
115
m_impl
.
releaseWriteLock
(tid);
116
}
117
catch
(
GenericRWLockImplException
& e)
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
Generated by
1.8.2