]> git.ipfire.org Git - thirdparty/squid.git/blame - src/ipc/ReadWriteLock.cc
Renamed squid.h to squid-old.h and config.h to squid.h
[thirdparty/squid.git] / src / ipc / ReadWriteLock.cc
CommitLineData
44c95fcf
AR
1/*
2 * $Id$
3 *
4 * DEBUG: section 54 Interprocess Communication
5 */
6
f7f3304a 7#include "squid-old.h"
44c95fcf
AR
8
9#include "Store.h"
10#include "ipc/ReadWriteLock.h"
11
12bool
13Ipc::ReadWriteLock::lockShared()
14{
15 ++readers; // this locks "new" writers out
16 if (!writers) // there are no old writers
17 return true;
18 --readers;
19 return false;
20}
21
22bool
23Ipc::ReadWriteLock::lockExclusive()
24{
25 if (!writers++) { // we are the first writer + this locks "new" readers out
26 if (!readers) // there are no old readers
27 return true;
28 }
29 --writers;
30 return false;
31}
32
33void
34Ipc::ReadWriteLock::unlockShared()
35{
36 assert(readers-- > 0);
37}
38
39void
40Ipc::ReadWriteLock::unlockExclusive()
41{
42 assert(writers-- > 0);
43}
44
45void
46Ipc::ReadWriteLock::switchExclusiveToShared()
47{
48 ++readers; // must be done before we release exclusive control
49 unlockExclusive();
50}
51
52void
53Ipc::ReadWriteLock::updateStats(ReadWriteLockStats &stats) const
54{
55 if (readers) {
56 ++stats.readable;
57 stats.readers += readers;
58 } else if (writers) {
59 ++stats.writeable;
60 stats.writers += writers;
61 } else {
62 ++stats.idle;
63 }
64 ++stats.count;
65}
66
67
68/* Ipc::ReadWriteLockStats */
69
70Ipc::ReadWriteLockStats::ReadWriteLockStats()
71{
72 memset(this, 0, sizeof(*this));
73}
9199139f 74
44c95fcf
AR
75void
76Ipc::ReadWriteLockStats::dump(StoreEntry &e) const
77{
78 storeAppendPrintf(&e, "Available locks: %9d\n", count);
79
80 if (!count)
81 return;
82
83 storeAppendPrintf(&e, "Reading: %9d %6.2f%%\n",
9199139f 84 readable, (100.0 * readable / count));
44c95fcf 85 storeAppendPrintf(&e, "Writing: %9d %6.2f%%\n",
9199139f 86 writeable, (100.0 * writeable / count));
44c95fcf 87 storeAppendPrintf(&e, "Idle: %9d %6.2f%%\n",
9199139f 88 idle, (100.0 * idle / count));
44c95fcf
AR
89
90 if (readers || writers) {
91 const int locked = readers + writers;
92 storeAppendPrintf(&e, "Readers: %9d %6.2f%%\n",
9199139f 93 readers, (100.0 * readers / locked));
44c95fcf 94 storeAppendPrintf(&e, "Writers: %9d %6.2f%%\n",
9199139f 95 writers, (100.0 * writers / locked));
44c95fcf
AR
96 }
97}