]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/ipc/ReadWriteLock.cc
2 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 54 Interprocess Communication */
12 #include "ipc/ReadWriteLock.h"
15 void Ipc::AssertFlagIsSet(std::atomic_flag
&flag
)
17 // If the flag was false, then we set it to true and assert. A true flag
18 // may help keep other processes away from this broken entry.
19 // Otherwise, we just set an already set flag, which is probably a no-op.
20 assert(flag
.test_and_set(std::memory_order_relaxed
));
24 Ipc::ReadWriteLock::lockShared()
26 ++readLevel
; // this locks "new" writers out
27 if (!writeLevel
|| appending
) { // nobody is writing, or sharing is OK
36 Ipc::ReadWriteLock::lockExclusive()
38 if (!writeLevel
++) { // we are the first writer + lock "new" readers out
39 if (!readLevel
) { // no old readers and nobody is becoming one
49 Ipc::ReadWriteLock::lockHeaders()
52 if (!updating
.test_and_set(std::memory_order_acquire
))
53 return true; // we got here first
54 // the updating lock was already set by somebody else
61 Ipc::ReadWriteLock::unlockShared()
69 Ipc::ReadWriteLock::unlockExclusive()
78 Ipc::ReadWriteLock::unlockHeaders()
80 AssertFlagIsSet(updating
);
81 updating
.clear(std::memory_order_release
);
86 Ipc::ReadWriteLock::switchExclusiveToShared()
89 ++readLevel
; // must be done before we release exclusive control
95 Ipc::ReadWriteLock::startAppending()
102 Ipc::ReadWriteLock::updateStats(ReadWriteLockStats
&stats
) const
106 stats
.readers
+= readers
;
107 } else if (writing
) {
110 stats
.appenders
+= appending
;
117 /* Ipc::ReadWriteLockStats */
119 Ipc::ReadWriteLockStats::ReadWriteLockStats()
121 memset(this, 0, sizeof(*this));
125 Ipc::ReadWriteLockStats::dump(StoreEntry
&e
) const
127 storeAppendPrintf(&e
, "Available locks: %9d\n", count
);
132 storeAppendPrintf(&e
, "Reading: %9d %6.2f%%\n",
133 readable
, (100.0 * readable
/ count
));
134 storeAppendPrintf(&e
, "Writing: %9d %6.2f%%\n",
135 writeable
, (100.0 * writeable
/ count
));
136 storeAppendPrintf(&e
, "Idle: %9d %6.2f%%\n",
137 idle
, (100.0 * idle
/ count
));
139 if (readers
|| writers
) {
140 const int locked
= readers
+ writers
;
141 storeAppendPrintf(&e
, "Readers: %9d %6.2f%%\n",
142 readers
, (100.0 * readers
/ locked
));
143 const double appPerc
= writers
? (100.0 * appenders
/ writers
) : 0.0;
144 storeAppendPrintf(&e
, "Writers: %9d %6.2f%% including Appenders: %9d %6.2f%%\n",
145 writers
, (100.0 * writers
/ locked
),