log4cplus
2.1.0
include
log4cplus
thread
impl
syncprims-pmsm.h
Go to the documentation of this file.
1
// -*- C++ -*-
2
// Copyright (C) 2010-2017, Vaclav Haisman. All rights reserved.
3
//
4
// Redistribution and use in source and binary forms, with or without modifica-
5
// tion, are permitted provided that the following conditions are met:
6
//
7
// 1. Redistributions of source code must retain the above copyright notice,
8
// this list of conditions and the following disclaimer.
9
//
10
// 2. Redistributions in binary form must reproduce the above copyright notice,
11
// this list of conditions and the following disclaimer in the documentation
12
// and/or other materials provided with the distribution.
13
//
14
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
15
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
17
// APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
19
// DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
20
// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
21
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24
30
31
32
#if ! defined (INSIDE_LOG4CPLUS)
33
# error "This header must not be be used outside log4cplus' implementation files."
34
#endif
35
36
37
// This implements algorithm described in "Concurrent Control with "Readers"
38
// and "Writers"; P.J. Courtois, F. Heymans, and D.L. Parnas;
39
// MBLE Research Laboratory; Brussels, Belgium"
40
41
42
inline
43
SharedMutex::SharedMutex ()
44
: m1 ()
45
, m2 ()
46
, m3 ()
47
, w (1, 1)
48
, writer_count (0)
49
, r (1, 1)
50
, reader_count (0)
51
{ }
52
53
54
inline
55
SharedMutex::~SharedMutex
()
56
{ }
57
58
59
inline
60
void
61
SharedMutex::rdlock
()
const
62
{
63
MutexGuard
m3_guard (m3);
64
SemaphoreGuard
r_guard (r);
65
MutexGuard
m1_guard (m1);
66
if
(reader_count + 1 == 1)
67
w.lock ();
68
69
reader_count += 1;
70
}
71
72
73
inline
74
void
75
SharedMutex::rdunlock
()
const
76
{
77
MutexGuard
m1_guard (m1);
78
if
(reader_count - 1 == 0)
79
w.unlock ();
80
81
reader_count -= 1;
82
}
83
84
85
inline
86
void
87
SharedMutex::wrlock
()
const
88
{
89
{
90
MutexGuard
m2_guard (m2);
91
if
(writer_count + 1 == 1)
92
r.lock ();
93
94
writer_count += 1;
95
}
96
try
97
{
98
w.lock ();
99
}
100
catch
(...)
101
{
102
MutexGuard
m2_guard (m2);
103
writer_count -= 1;
104
throw
;
105
}
106
}
107
108
109
inline
110
void
111
SharedMutex::wrunlock
()
const
112
{
113
w.unlock ();
114
MutexGuard
m2_guard (m2);
115
if
(writer_count - 1 == 0)
116
r.unlock ();
117
118
writer_count -= 1;
119
}
log4cplus::thread::SharedMutex::rdunlock
void rdunlock() const
Definition:
syncprims-pmsm.h:75
log4cplus::thread::SharedMutex::~SharedMutex
~SharedMutex()
Definition:
syncprims-pmsm.h:55
log4cplus::thread::SharedMutex::wrunlock
void wrunlock() const
Definition:
syncprims-pmsm.h:111
log4cplus::thread::SharedMutex::wrlock
void wrlock() const
Definition:
syncprims-pmsm.h:87
log4cplus::thread::SharedMutex::rdlock
void rdlock() const
Definition:
syncprims-pmsm.h:61
log4cplus::thread::SyncGuard
Definition:
syncprims.h:43
Generated on Tue Feb 28 2023 19:27:01 for log4cplus by
1.9.1