ReadWriteLock.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
3  *
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.
7  */
8 
9 #ifndef SQUID_SRC_IPC_READWRITELOCK_H
10 #define SQUID_SRC_IPC_READWRITELOCK_H
11 
12 #include <atomic>
13 #include <iosfwd>
14 
15 class StoreEntry;
16 
17 namespace Ipc
18 {
19 
20 class ReadWriteLockStats;
21 
27 {
28 public:
29  ReadWriteLock() : readers(0), writing(false), appending(false), readLevel(0), writeLevel(0)
30  {}
31 
32  bool lockShared();
33  bool lockExclusive();
34  bool lockHeaders();
35  void unlockShared();
36  void unlockExclusive();
37  void unlockHeaders();
42 
43  void startAppending();
44 
49 
51  void updateStats(ReadWriteLockStats &stats) const;
52 
53 public:
54  mutable std::atomic<uint32_t> readers;
55  std::atomic<bool> writing;
56  std::atomic<bool> appending;
57  std::atomic_flag updating;
58 
59 private:
60  bool finalizeExclusive();
61 
62  mutable std::atomic<uint32_t> readLevel;
63  std::atomic<uint32_t> writeLevel;
64 };
65 
67 std::ostream &operator <<(std::ostream &, const ReadWriteLock &);
68 
71 {
72 public:
74 
75  void dump(StoreEntry &e) const;
76 
77  int count;
78  int readable;
79  int writeable;
80  int idle;
81  int readers;
82  int writers;
83  int appenders;
84 };
85 
89 void AssertFlagIsSet(std::atomic_flag &flag);
90 
91 } // namespace Ipc
92 
93 #endif /* SQUID_SRC_IPC_READWRITELOCK_H */
94 
approximate stats of a set of ReadWriteLocks
Definition: ReadWriteLock.h:70
std::atomic< bool > writing
there is a writing user (there can be at most 1)
Definition: ReadWriteLock.h:55
bool lockShared()
lock for reading or return false
bool unlockSharedAndSwitchToExclusive()
void updateStats(ReadWriteLockStats &stats) const
adds approximate current stats to the supplied ones
bool lockExclusive()
lock for modification or return false
int writers
sum of lock.writers
Definition: ReadWriteLock.h:82
std::atomic< bool > appending
the writer has promised to only append
Definition: ReadWriteLock.h:56
std::atomic_flag updating
a reader is updating metadata/headers
Definition: ReadWriteLock.h:57
void unlockShared()
undo successful sharedLock()
std::atomic< uint32_t > readers
number of reading users
Definition: ReadWriteLock.h:54
void unlockExclusive()
undo successful exclusiveLock()
int readers
sum of lock.readers
Definition: ReadWriteLock.h:81
bool lockHeaders()
lock for [readable] metadata update or return false
int appenders
number of appending writers
Definition: ReadWriteLock.h:83
void dump(StoreEntry &e) const
int idle
number of unlocked locks
Definition: ReadWriteLock.h:80
void unlockHeaders()
undo successful lockHeaders()
void AssertFlagIsSet(std::atomic_flag &flag)
bool stopAppendingAndRestoreExclusive()
std::atomic< uint32_t > writeLevel
number of users writing (or trying to write)
Definition: ReadWriteLock.h:63
int writeable
number of locks locked for writing
Definition: ReadWriteLock.h:79
std::ostream & operator<<(std::ostream &os, const QuestionerId &qid)
Definition: QuestionerId.h:63
int readable
number of locks locked for reading
Definition: ReadWriteLock.h:78
void switchExclusiveToShared()
void startAppending()
writer keeps its lock but also allows reading
std::atomic< uint32_t > readLevel
number of users reading (or trying to)
Definition: ReadWriteLock.h:62
int count
the total number of locks
Definition: ReadWriteLock.h:77
Definition: IpcIoFile.h:23

 

Introduction

Documentation

Support

Miscellaneous