Line | Count | Source |
1 | | // Copyright (c) 2009-2010 Satoshi Nakamoto |
2 | | // Copyright (c) 2009-present The Bitcoin Core developers |
3 | | // Distributed under the MIT software license, see the accompanying |
4 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | | |
6 | | #ifndef BITCOIN_SYNC_H |
7 | | #define BITCOIN_SYNC_H |
8 | | |
9 | | // This header declares threading primitives compatible with Clang |
10 | | // Thread Safety Analysis and provides appropriate annotation macros. |
11 | | #include <threadsafety.h> // IWYU pragma: export |
12 | | #include <util/macros.h> |
13 | | |
14 | | #include <cassert> |
15 | | #include <condition_variable> |
16 | | #include <mutex> |
17 | | #include <string> |
18 | | #include <thread> |
19 | | |
20 | | //////////////////////////////////////////////// |
21 | | // // |
22 | | // THE SIMPLE DEFINITION, EXCLUDING DEBUG CODE // |
23 | | // // |
24 | | //////////////////////////////////////////////// |
25 | | |
26 | | /* |
27 | | RecursiveMutex mutex; |
28 | | std::recursive_mutex mutex; |
29 | | |
30 | | LOCK(mutex); |
31 | | std::unique_lock<std::recursive_mutex> criticalblock(mutex); |
32 | | |
33 | | LOCK2(mutex1, mutex2); |
34 | | std::unique_lock<std::recursive_mutex> criticalblock1(mutex1); |
35 | | std::unique_lock<std::recursive_mutex> criticalblock2(mutex2); |
36 | | |
37 | | TRY_LOCK(mutex, name); |
38 | | std::unique_lock<std::recursive_mutex> name(mutex, std::try_to_lock_t); |
39 | | */ |
40 | | |
41 | | /////////////////////////////// |
42 | | // // |
43 | | // THE ACTUAL IMPLEMENTATION // |
44 | | // // |
45 | | /////////////////////////////// |
46 | | |
47 | | #ifdef DEBUG_LOCKORDER |
48 | | template <typename MutexType> |
49 | | void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false); |
50 | | void LeaveCritical(); |
51 | | void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line); |
52 | | template <typename MutexType> |
53 | | void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) EXCLUSIVE_LOCKS_REQUIRED(cs); |
54 | | template <typename MutexType> |
55 | | void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) LOCKS_EXCLUDED(cs); |
56 | | void DeleteLock(void* cs); |
57 | | bool LockStackEmpty(); |
58 | | |
59 | | /** |
60 | | * Call abort() if a potential lock order deadlock bug is detected, instead of |
61 | | * just logging information and throwing a logic_error. Defaults to true, and |
62 | | * set to false in DEBUG_LOCKORDER unit tests. |
63 | | */ |
64 | | extern bool g_debug_lockorder_abort; |
65 | | #else |
66 | | template <typename MutexType> |
67 | | inline void EnterCritical(const char* pszName, const char* pszFile, int nLine, MutexType* cs, bool fTry = false) {} |
68 | | inline void LeaveCritical() {} |
69 | | inline void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) {} |
70 | | template <typename MutexType> |
71 | | inline void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) EXCLUSIVE_LOCKS_REQUIRED(cs) {} |
72 | | template <typename MutexType> |
73 | | void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) LOCKS_EXCLUDED(cs) {} |
74 | | inline void DeleteLock(void* cs) {} |
75 | | inline bool LockStackEmpty() { return true; } |
76 | | #endif |
77 | | |
78 | | /* |
79 | | * Called when a mutex fails to lock immediately because it is held by another |
80 | | * thread, or spuriously. Responsible for locking the lock before returning. |
81 | | */ |
82 | | #ifdef DEBUG_LOCKCONTENTION |
83 | | |
84 | | template <typename LockType> |
85 | | void ContendedLock(std::string_view name, std::string_view file, int nLine, LockType& lock); |
86 | | #endif |
87 | | |
88 | | /** |
89 | | * Template mixin that adds -Wthread-safety locking annotations and lock order |
90 | | * checking to a subset of the mutex API. |
91 | | */ |
92 | | template <typename PARENT> |
93 | | class LOCKABLE AnnotatedMixin : public PARENT |
94 | | { |
95 | | public: |
96 | 149k | ~AnnotatedMixin() { |
97 | 149k | DeleteLock((void*)this); |
98 | 149k | } AnnotatedMixin<std::mutex>::~AnnotatedMixin() Line | Count | Source | 96 | 133k | ~AnnotatedMixin() { | 97 | 133k | DeleteLock((void*)this); | 98 | 133k | } |
AnnotatedMixin<std::recursive_mutex>::~AnnotatedMixin() Line | Count | Source | 96 | 15.9k | ~AnnotatedMixin() { | 97 | 15.9k | DeleteLock((void*)this); | 98 | 15.9k | } |
|
99 | | |
100 | | void lock() EXCLUSIVE_LOCK_FUNCTION() |
101 | | { |
102 | | PARENT::lock(); |
103 | | } |
104 | | |
105 | | void unlock() UNLOCK_FUNCTION() |
106 | | { |
107 | | PARENT::unlock(); |
108 | | } |
109 | | |
110 | | bool try_lock() EXCLUSIVE_TRYLOCK_FUNCTION(true) |
111 | 200 | { |
112 | 200 | return PARENT::try_lock(); |
113 | 200 | } |
114 | | |
115 | | using unique_lock = std::unique_lock<PARENT>; |
116 | | #ifdef __clang__ |
117 | | //! For negative capabilities in the Clang Thread Safety Analysis. |
118 | | //! A negative requirement uses the EXCLUSIVE_LOCKS_REQUIRED attribute, in conjunction |
119 | | //! with the ! operator, to indicate that a mutex should not be held. |
120 | | const AnnotatedMixin& operator!() const { return *this; } |
121 | | #endif // __clang__ |
122 | | }; |
123 | | |
124 | | /** |
125 | | * Wrapped mutex: supports recursive locking, but no waiting |
126 | | * TODO: We should move away from using the recursive lock by default. |
127 | | */ |
128 | | using RecursiveMutex = AnnotatedMixin<std::recursive_mutex>; |
129 | | |
130 | | /** Wrapped mutex: supports waiting but not recursive locking */ |
131 | | using Mutex = AnnotatedMixin<std::mutex>; |
132 | | |
133 | | /** Different type to mark Mutex at global scope |
134 | | * |
135 | | * Thread safety analysis can't handle negative assertions about mutexes |
136 | | * with global scope well, so mark them with a separate type, and |
137 | | * eventually move all the mutexes into classes so they are not globally |
138 | | * visible. |
139 | | * |
140 | | * See: https://github.com/bitcoin/bitcoin/pull/20272#issuecomment-720755781 |
141 | | */ |
142 | | class GlobalMutex : public Mutex { }; |
143 | | |
144 | 67.0M | #define AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs) |
145 | | |
146 | 5.32M | inline void AssertLockNotHeldInline(const char* name, const char* file, int line, Mutex* cs) EXCLUSIVE_LOCKS_REQUIRED(!cs) { AssertLockNotHeldInternal(name, file, line, cs); } |
147 | 891k | inline void AssertLockNotHeldInline(const char* name, const char* file, int line, RecursiveMutex* cs) LOCKS_EXCLUDED(cs) { AssertLockNotHeldInternal(name, file, line, cs); } |
148 | 0 | inline void AssertLockNotHeldInline(const char* name, const char* file, int line, GlobalMutex* cs) LOCKS_EXCLUDED(cs) { AssertLockNotHeldInternal(name, file, line, cs); } |
149 | 6.21M | #define AssertLockNotHeld(cs) AssertLockNotHeldInline(#cs, __FILE__, __LINE__, &cs) |
150 | | |
151 | | /** Wrapper around std::unique_lock style lock for MutexType. */ |
152 | | template <typename MutexType> |
153 | | class SCOPED_LOCKABLE UniqueLock : public MutexType::unique_lock |
154 | | { |
155 | | private: |
156 | | using Base = typename MutexType::unique_lock; |
157 | | |
158 | | void Enter(const char* pszName, const char* pszFile, int nLine) |
159 | 81.1M | { |
160 | 81.1M | EnterCritical(pszName, pszFile, nLine, Base::mutex()); |
161 | 81.1M | #ifdef DEBUG_LOCKCONTENTION |
162 | 81.1M | if (!Base::try_lock()) { |
163 | 665k | ContendedLock(pszName, pszFile, nLine, static_cast<Base&>(*this)); |
164 | 665k | } |
165 | | #else |
166 | | Base::lock(); |
167 | | #endif |
168 | 81.1M | } UniqueLock<AnnotatedMixin<std::mutex>>::Enter(char const*, char const*, int) Line | Count | Source | 159 | 31.3M | { | 160 | 31.3M | EnterCritical(pszName, pszFile, nLine, Base::mutex()); | 161 | 31.3M | #ifdef DEBUG_LOCKCONTENTION | 162 | 31.3M | if (!Base::try_lock()) { | 163 | 576k | ContendedLock(pszName, pszFile, nLine, static_cast<Base&>(*this)); | 164 | 576k | } | 165 | | #else | 166 | | Base::lock(); | 167 | | #endif | 168 | 31.3M | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::Enter(char const*, char const*, int) Line | Count | Source | 159 | 49.4M | { | 160 | 49.4M | EnterCritical(pszName, pszFile, nLine, Base::mutex()); | 161 | 49.4M | #ifdef DEBUG_LOCKCONTENTION | 162 | 49.4M | if (!Base::try_lock()) { | 163 | 89.6k | ContendedLock(pszName, pszFile, nLine, static_cast<Base&>(*this)); | 164 | 89.6k | } | 165 | | #else | 166 | | Base::lock(); | 167 | | #endif | 168 | 49.4M | } |
UniqueLock<GlobalMutex>::Enter(char const*, char const*, int) Line | Count | Source | 159 | 403k | { | 160 | 403k | EnterCritical(pszName, pszFile, nLine, Base::mutex()); | 161 | 403k | #ifdef DEBUG_LOCKCONTENTION | 162 | 403k | if (!Base::try_lock()) { | 163 | 0 | ContendedLock(pszName, pszFile, nLine, static_cast<Base&>(*this)); | 164 | 0 | } | 165 | | #else | 166 | | Base::lock(); | 167 | | #endif | 168 | 403k | } |
|
169 | | |
170 | | bool TryEnter(const char* pszName, const char* pszFile, int nLine) |
171 | 1.13k | { |
172 | 1.13k | EnterCritical(pszName, pszFile, nLine, Base::mutex(), true); |
173 | 1.13k | if (Base::try_lock()) { |
174 | 1.13k | return true; |
175 | 1.13k | } |
176 | 0 | LeaveCritical(); |
177 | 0 | return false; |
178 | 1.13k | } UniqueLock<AnnotatedMixin<std::mutex>>::TryEnter(char const*, char const*, int) Line | Count | Source | 171 | 1.13k | { | 172 | 1.13k | EnterCritical(pszName, pszFile, nLine, Base::mutex(), true); | 173 | 1.13k | if (Base::try_lock()) { | 174 | 1.13k | return true; | 175 | 1.13k | } | 176 | 0 | LeaveCritical(); | 177 | 0 | return false; | 178 | 1.13k | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::TryEnter(char const*, char const*, int) Line | Count | Source | 171 | 2 | { | 172 | 2 | EnterCritical(pszName, pszFile, nLine, Base::mutex(), true); | 173 | 2 | if (Base::try_lock()) { | 174 | 2 | return true; | 175 | 2 | } | 176 | 0 | LeaveCritical(); | 177 | 0 | return false; | 178 | 2 | } |
Unexecuted instantiation: UniqueLock<GlobalMutex>::TryEnter(char const*, char const*, int) |
179 | | |
180 | | public: |
181 | 81.0M | UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock) |
182 | 81.0M | { |
183 | 81.0M | if (fTry) |
184 | 1.13k | TryEnter(pszName, pszFile, nLine); |
185 | 81.0M | else |
186 | 81.0M | Enter(pszName, pszFile, nLine); |
187 | 81.0M | } UniqueLock<AnnotatedMixin<std::mutex>>::UniqueLock(AnnotatedMixin<std::mutex>&, char const*, char const*, int, bool) Line | Count | Source | 181 | 31.3M | UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock) | 182 | 31.3M | { | 183 | 31.3M | if (fTry) | 184 | 1.13k | TryEnter(pszName, pszFile, nLine); | 185 | 31.3M | else | 186 | 31.3M | Enter(pszName, pszFile, nLine); | 187 | 31.3M | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::UniqueLock(AnnotatedMixin<std::recursive_mutex>&, char const*, char const*, int, bool) Line | Count | Source | 181 | 49.3M | UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock) | 182 | 49.3M | { | 183 | 49.3M | if (fTry) | 184 | 2 | TryEnter(pszName, pszFile, nLine); | 185 | 49.3M | else | 186 | 49.3M | Enter(pszName, pszFile, nLine); | 187 | 49.3M | } |
UniqueLock<GlobalMutex>::UniqueLock(GlobalMutex&, char const*, char const*, int, bool) Line | Count | Source | 181 | 403k | UniqueLock(MutexType& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : Base(mutexIn, std::defer_lock) | 182 | 403k | { | 183 | 403k | if (fTry) | 184 | 0 | TryEnter(pszName, pszFile, nLine); | 185 | 403k | else | 186 | 403k | Enter(pszName, pszFile, nLine); | 187 | 403k | } |
|
188 | | |
189 | | UniqueLock(MutexType* pmutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(pmutexIn) |
190 | 128k | { |
191 | 128k | if (!pmutexIn) return; |
192 | | |
193 | 126k | *static_cast<Base*>(this) = Base(*pmutexIn, std::defer_lock); |
194 | 126k | if (fTry) |
195 | 0 | TryEnter(pszName, pszFile, nLine); |
196 | 126k | else |
197 | 126k | Enter(pszName, pszFile, nLine); |
198 | 126k | } |
199 | | |
200 | | ~UniqueLock() UNLOCK_FUNCTION() |
201 | 83.3M | { |
202 | 83.3M | if (Base::owns_lock()) |
203 | 81.1M | LeaveCritical(); |
204 | 83.3M | } UniqueLock<AnnotatedMixin<std::mutex>>::~UniqueLock() Line | Count | Source | 201 | 33.4M | { | 202 | 33.4M | if (Base::owns_lock()) | 203 | 31.3M | LeaveCritical(); | 204 | 33.4M | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::~UniqueLock() Line | Count | Source | 201 | 49.5M | { | 202 | 49.5M | if (Base::owns_lock()) | 203 | 49.4M | LeaveCritical(); | 204 | 49.5M | } |
UniqueLock<GlobalMutex>::~UniqueLock() Line | Count | Source | 201 | 403k | { | 202 | 403k | if (Base::owns_lock()) | 203 | 403k | LeaveCritical(); | 204 | 403k | } |
|
205 | | |
206 | | operator bool() |
207 | 1.13k | { |
208 | 1.13k | return Base::owns_lock(); |
209 | 1.13k | } UniqueLock<AnnotatedMixin<std::recursive_mutex>>::operator bool() Line | Count | Source | 207 | 2 | { | 208 | 2 | return Base::owns_lock(); | 209 | 2 | } |
UniqueLock<AnnotatedMixin<std::mutex>>::operator bool() Line | Count | Source | 207 | 1.13k | { | 208 | 1.13k | return Base::owns_lock(); | 209 | 1.13k | } |
|
210 | | |
211 | | protected: |
212 | | // needed for reverse_lock |
213 | 2.17M | UniqueLock() = default; UniqueLock<AnnotatedMixin<std::mutex>>::UniqueLock() Line | Count | Source | 213 | 2.10M | UniqueLock() = default; |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::UniqueLock() Line | Count | Source | 213 | 73.7k | UniqueLock() = default; |
|
214 | | |
215 | | public: |
216 | | /** |
217 | | * An RAII-style reverse lock. Unlocks on construction and locks on destruction. |
218 | | */ |
219 | | class SCOPED_LOCKABLE reverse_lock { |
220 | | public: |
221 | 2.17M | explicit reverse_lock(UniqueLock& _lock, const MutexType& mutex, const char* _guardname, const char* _file, int _line) UNLOCK_FUNCTION(mutex) : lock(_lock), file(_file), line(_line) { |
222 | | // Ensure that mutex passed back for thread-safety analysis is indeed the original |
223 | 2.17M | assert(std::addressof(mutex) == lock.mutex()); |
224 | | |
225 | 2.17M | CheckLastCritical((void*)lock.mutex(), lockname, _guardname, _file, _line); |
226 | 2.17M | lock.unlock(); |
227 | 2.17M | LeaveCritical(); |
228 | 2.17M | lock.swap(templock); |
229 | 2.17M | } UniqueLock<AnnotatedMixin<std::mutex>>::reverse_lock::reverse_lock(UniqueLock<AnnotatedMixin<std::mutex>>&, AnnotatedMixin<std::mutex> const&, char const*, char const*, int) Line | Count | Source | 221 | 2.10M | explicit reverse_lock(UniqueLock& _lock, const MutexType& mutex, const char* _guardname, const char* _file, int _line) UNLOCK_FUNCTION(mutex) : lock(_lock), file(_file), line(_line) { | 222 | | // Ensure that mutex passed back for thread-safety analysis is indeed the original | 223 | 2.10M | assert(std::addressof(mutex) == lock.mutex()); | 224 | | | 225 | 2.10M | CheckLastCritical((void*)lock.mutex(), lockname, _guardname, _file, _line); | 226 | 2.10M | lock.unlock(); | 227 | 2.10M | LeaveCritical(); | 228 | 2.10M | lock.swap(templock); | 229 | 2.10M | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::reverse_lock::reverse_lock(UniqueLock<AnnotatedMixin<std::recursive_mutex>>&, AnnotatedMixin<std::recursive_mutex> const&, char const*, char const*, int) Line | Count | Source | 221 | 73.7k | explicit reverse_lock(UniqueLock& _lock, const MutexType& mutex, const char* _guardname, const char* _file, int _line) UNLOCK_FUNCTION(mutex) : lock(_lock), file(_file), line(_line) { | 222 | | // Ensure that mutex passed back for thread-safety analysis is indeed the original | 223 | 73.7k | assert(std::addressof(mutex) == lock.mutex()); | 224 | | | 225 | 73.7k | CheckLastCritical((void*)lock.mutex(), lockname, _guardname, _file, _line); | 226 | 73.7k | lock.unlock(); | 227 | 73.7k | LeaveCritical(); | 228 | 73.7k | lock.swap(templock); | 229 | 73.7k | } |
|
230 | | |
231 | 2.17M | ~reverse_lock() UNLOCK_FUNCTION() { |
232 | 2.17M | templock.swap(lock); |
233 | 2.17M | EnterCritical(lockname.c_str(), file.c_str(), line, lock.mutex()); |
234 | 2.17M | lock.lock(); |
235 | 2.17M | } UniqueLock<AnnotatedMixin<std::mutex>>::reverse_lock::~reverse_lock() Line | Count | Source | 231 | 2.10M | ~reverse_lock() UNLOCK_FUNCTION() { | 232 | 2.10M | templock.swap(lock); | 233 | 2.10M | EnterCritical(lockname.c_str(), file.c_str(), line, lock.mutex()); | 234 | 2.10M | lock.lock(); | 235 | 2.10M | } |
UniqueLock<AnnotatedMixin<std::recursive_mutex>>::reverse_lock::~reverse_lock() Line | Count | Source | 231 | 73.7k | ~reverse_lock() UNLOCK_FUNCTION() { | 232 | 73.7k | templock.swap(lock); | 233 | 73.7k | EnterCritical(lockname.c_str(), file.c_str(), line, lock.mutex()); | 234 | 73.7k | lock.lock(); | 235 | 73.7k | } |
|
236 | | |
237 | | private: |
238 | | reverse_lock(reverse_lock const&); |
239 | | reverse_lock& operator=(reverse_lock const&); |
240 | | |
241 | | UniqueLock& lock; |
242 | | UniqueLock templock; |
243 | | std::string lockname; |
244 | | const std::string file; |
245 | | const int line; |
246 | | }; |
247 | | friend class reverse_lock; |
248 | | }; |
249 | | |
250 | | // clang's thread-safety analyzer is unable to deal with aliases of mutexes, so |
251 | | // it is not possible to use the lock's copy of the mutex for that purpose. |
252 | | // Instead, the original mutex needs to be passed back to the reverse_lock for |
253 | | // the sake of thread-safety analysis, but it is not actually used otherwise. |
254 | 2.17M | #define REVERSE_LOCK(g, cs) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, cs, #cs, __FILE__, __LINE__) |
255 | | |
256 | | // When locking a Mutex, require negative capability to ensure the lock |
257 | | // is not already held |
258 | 32.6M | inline Mutex& MaybeCheckNotHeld(Mutex& cs) EXCLUSIVE_LOCKS_REQUIRED(!cs) LOCK_RETURNED(cs) { return cs; } |
259 | 0 | inline Mutex* MaybeCheckNotHeld(Mutex* cs) EXCLUSIVE_LOCKS_REQUIRED(!cs) LOCK_RETURNED(cs) { return cs; } |
260 | | |
261 | | // When locking a GlobalMutex or RecursiveMutex, just check it is not |
262 | | // locked in the surrounding scope. |
263 | | template <typename MutexType> |
264 | 50.5M | inline MutexType& MaybeCheckNotHeld(MutexType& m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; }AnnotatedMixin<std::recursive_mutex>& MaybeCheckNotHeld<AnnotatedMixin<std::recursive_mutex>>(AnnotatedMixin<std::recursive_mutex>&) Line | Count | Source | 264 | 50.1M | inline MutexType& MaybeCheckNotHeld(MutexType& m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; } |
GlobalMutex& MaybeCheckNotHeld<GlobalMutex>(GlobalMutex&) Line | Count | Source | 264 | 403k | inline MutexType& MaybeCheckNotHeld(MutexType& m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; } |
|
265 | | template <typename MutexType> |
266 | 128k | inline MutexType* MaybeCheckNotHeld(MutexType* m) LOCKS_EXCLUDED(m) LOCK_RETURNED(m) { return m; } |
267 | | |
268 | 72.3M | #define LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) |
269 | | #define LOCK2(cs1, cs2) \ |
270 | 463k | UniqueLock criticalblock1(MaybeCheckNotHeld(cs1), #cs1, __FILE__, __LINE__); \ |
271 | 463k | UniqueLock criticalblock2(MaybeCheckNotHeld(cs2), #cs2, __FILE__, __LINE__) |
272 | 7.79M | #define LOCK_ARGS(cs) MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__ |
273 | 1.13k | #define TRY_LOCK(cs, name) UniqueLock name(LOCK_ARGS(cs), true) |
274 | 7.63M | #define WAIT_LOCK(cs, name) UniqueLock name(LOCK_ARGS(cs)) |
275 | | |
276 | | //! Run code while locking a mutex. |
277 | | //! |
278 | | //! Examples: |
279 | | //! |
280 | | //! WITH_LOCK(cs, shared_val = shared_val + 1); |
281 | | //! |
282 | | //! int val = WITH_LOCK(cs, return shared_val); |
283 | | //! |
284 | | //! Note: |
285 | | //! |
286 | | //! Since the return type deduction follows that of decltype(auto), while the |
287 | | //! deduced type of: |
288 | | //! |
289 | | //! WITH_LOCK(cs, int i = 1; return i); |
290 | | //! |
291 | | //! is int, the deduced type of: |
292 | | //! |
293 | | //! WITH_LOCK(cs, int j = 1; return (j)); |
294 | | //! |
295 | | //! is &int, a reference to a local variable |
296 | | //! |
297 | | //! The above is detectable at compile-time with the -Wreturn-local-addr flag in |
298 | | //! gcc and the -Wreturn-stack-address flag in clang, both enabled by default. |
299 | 1.98M | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }())blockchain_tests.cpp:blockchain_tests::invalidate_block::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain_tests.cpp:blockchain_tests::invalidate_block::test_method()::$_1::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain_tests.cpp:blockchain_tests::invalidate_block::test_method()::$_2::operator()() const Line | Count | Source | 299 | 180 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain_tests.cpp:blockchain_tests::invalidate_block::test_method()::$_3::operator()() const Line | Count | Source | 299 | 180 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain_tests.cpp:blockchain_tests::invalidate_block::test_method()::$_4::operator()() const Line | Count | Source | 299 | 20 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockfilter_index_tests.cpp:blockfilter_index_tests::index_reorg_crash::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockfilter_index_tests.cpp:blockfilter_index_tests::index_reorg_crash::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_3::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_4::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_5::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockmanager_tests.cpp:blockmanager_tests::blockmanager_scan_unlink_already_pruned_files::test_method()::$_6::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<FakeCheckCheckCompletion, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<FixedCheck, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<UniqueCheck, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<MemoryCheck, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<FrozenCleanupCheck, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<FakeCheck, int>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
HeadersGeneratorSetup::chain_start::'lambda'()::operator()() const Line | Count | Source | 299 | 3 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
interfaces_tests.cpp:interfaces_tests::findCommonAncestor::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CScheduler::stop()::'lambda'()::operator()() const Line | Count | Source | 299 | 1.28k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
peerman_tests.cpp:peerman_tests::connections_desirable_service_flags::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CScheduler::StopWhenDrained()::'lambda'()::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
testnet4_miner_tests.cpp:testnet4_miner_tests::MiningInterface::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
ThreadPool::WorkersCount()::'lambda'()::operator()() const Line | Count | Source | 299 | 4.96k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
ThreadPool::Interrupt()::'lambda'()::operator()() const Line | Count | Source | 299 | 1.14k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
ThreadPool::WorkQueueSize()::'lambda'()::operator()() const Line | Count | Source | 299 | 171k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
CCheckQueue<CScriptCheck, std::pair<ScriptError_t, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>::~CCheckQueue()::'lambda'()::operator()() const Line | Count | Source | 299 | 1.19k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
txdownload_tests.cpp:txdownload_tests::handle_missing_inputs::test_method()::$_0::operator()() const Line | Count | Source | 299 | 8 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
txpackage_tests.cpp:txpackage_tests::package_cpfp_tests::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
txvalidationcache_tests.cpp:txvalidationcache_tests::tx_mempool_block_doublespend::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
txvalidationcache_tests.cpp:txvalidationcache_tests::tx_mempool_block_doublespend::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_block_tests.cpp:validation_block_tests::MinerTestingSetup::Block(uint256 const&)::$_0::operator()() const Line | Count | Source | 299 | 829 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_block_tests.cpp:validation_block_tests::MinerTestingSetup::FinalizeBlock(std::shared_ptr<CBlock>)::$_0::operator()() const Line | Count | Source | 299 | 829 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstate_tests.cpp:validation_chainstate_tests::validation_chainstate_resize_caches::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstate_tests.cpp:validation_chainstate_tests::validation_chainstate_resize_caches::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstate_tests.cpp:validation_chainstate_tests::connect_tip_does_not_cache_inputs_on_failed_connect::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstate_tests.cpp:bool CreateAndActivateUTXOSnapshot<$_4>(TestingSetup*, $_4, bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager::test_method()::$_4::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager::test_method()::$_6::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager::test_method()::$_9::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager::test_method()::$_13::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_rebalance_caches::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_rebalance_caches::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<$_37 const>(TestingSetup*, $_37 const, bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 12 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda'(AutoFile&, node::SnapshotMetadata&)>(TestingSetup*, validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda'(AutoFile&, node::SnapshotMetadata&), bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda0'(AutoFile&, node::SnapshotMetadata&)>(TestingSetup*, validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda0'(AutoFile&, node::SnapshotMetadata&), bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda1'(AutoFile&, node::SnapshotMetadata&)>(TestingSetup*, validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda1'(AutoFile&, node::SnapshotMetadata&), bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda2'(AutoFile&, node::SnapshotMetadata&)>(TestingSetup*, validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda2'(AutoFile&, node::SnapshotMetadata&), bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:bool CreateAndActivateUTXOSnapshot<validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda3'(AutoFile&, node::SnapshotMetadata&)>(TestingSetup*, validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda3'(AutoFile&, node::SnapshotMetadata&), bool, bool)::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests::SnapshotTestSetup::SetupSnapshot()::'lambda'()::operator()() const Line | Count | Source | 299 | 4 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_loadblockindex::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_loadblockindex::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_init::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_completion::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_completion::test_method()::$_3::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_completion::test_method()::$_7::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_completion_hash_mismatch::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation_chainstatemanager_tests.cpp:validation_chainstatemanager_tests::chainstatemanager_snapshot_completion_hash_mismatch::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
coinselector_tests.cpp:wallet::coinselector_tests::bnb_sffo_restriction::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
coinselector_tests.cpp:wallet::coinselector_tests::bnb_sffo_restriction::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
spend_tests.cpp:wallet::spend_tests::SubtractFee::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
spend_tests.cpp:wallet::spend_tests::wallet_duplicated_preset_inputs_test::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet_tests.cpp:wallet::wallet_tests::scan_for_wallet_transactions::test_method()::$_1::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet_tests.cpp:wallet::wallet_tests::scan_for_wallet_transactions::test_method()::$_2::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet_tests.cpp:wallet::wallet_tests::scan_for_wallet_transactions::test_method()::$_3::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet_tests.cpp:wallet::wallet_tests::TestLoadWallet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, wallet::DatabaseFormat, std::function<void (std::shared_ptr<wallet::CWallet>)>)::$_0::operator()() const Line | Count | Source | 299 | 3 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet::wallet_tests::ListCoinsTestingSetup::ListCoinsTestingSetup()::'lambda'()::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet_tests.cpp:wallet::wallet_tests::BasicOutputTypesTest::test_method()::$_0::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
V1Transport::ReceivedMessageComplete() const::'lambda'()::operator()() const Line | Count | Source | 299 | 323k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
HTTPRequestTracker::AddRequest(evhttp_request*)::'lambda'()::operator()() const Line | Count | Source | 299 | 171k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
HTTPRequestTracker::CountActiveConnections() const::'lambda'()::operator()() const Line | Count | Source | 299 | 1.13k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
base.cpp:BaseIndex::Init()::$_0::operator()() const Line | Count | Source | 299 | 145 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
base.cpp:BaseIndex::Sync()::$_0::operator()() const Line | Count | Source | 299 | 7.68k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
base.cpp:BaseIndex::SetBestBlockIndex(CBlockIndex const*)::$_0::operator()() const Line | Count | Source | 299 | 6.81k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:Interrupt(node::NodeContext&)::$_0::operator()() const Line | Count | Source | 299 | 1.11k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_8::operator()() const Line | Count | Source | 299 | 961 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_9::operator()() const Line | Count | Source | 299 | 998 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:StartIndexBackgroundSync(node::NodeContext&)::$_0::operator()() const Line | Count | Source | 299 | 998 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:StartIndexBackgroundSync(node::NodeContext&)::$_1::operator()() const Line | Count | Source | 299 | 998 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
init.cpp:AppInitMain(node::NodeContext&, interfaces::BlockAndHeaderTipInfo*)::$_10::operator()() const::'lambda'()::operator()() const Line | Count | Source | 299 | 998 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net.cpp:CConnman::AddConnection(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, ConnectionType, bool)::$_0::operator()() const Line | Count | Source | 299 | 150 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net.cpp:CConnman::SocketHandlerConnected(std::vector<CNode*, std::allocator<CNode*>> const&, std::unordered_map<std::shared_ptr<Sock const>, Sock::Events, Sock::HashSharedPtrSock, Sock::EqualSharedPtrSock, std::allocator<std::pair<std::shared_ptr<Sock const> const, Sock::Events>>> const&)::$_0::operator()() const Line | Count | Source | 299 | 258 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net.cpp:CConnman::StopNodes()::$_0::operator()() const Line | Count | Source | 299 | 2.25k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net.cpp:CConnman::StopNodes()::$_1::operator()() const Line | Count | Source | 299 | 2.25k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::Peer::GetTxRelay()::'lambda'()::operator()() const Line | Count | Source | 299 | 532k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::GetNodeStateStats(long, CNodeStateStats&) const::$_0::operator()() const Line | Count | Source | 299 | 13.3k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::InitializeNode(CNode const&, ServiceFlags)::$_0::operator()() const Line | Count | Source | 299 | 1.62k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::FinalizeNode(CNode const&)::$_0::operator()() const Line | Count | Source | 299 | 840 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:_ZZZN12_GLOBAL__N_115PeerManagerImpl16FindTxForGetDataERKNS_4Peer7TxRelayERK7GenTxidENK3$_0clI22transaction_identifierILb0EEEEDaRKT_ENKUlvE_clEv Line | Count | Source | 299 | 73 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:_ZZZN12_GLOBAL__N_115PeerManagerImpl16FindTxForGetDataERKNS_4Peer7TxRelayERK7GenTxidENK3$_0clI22transaction_identifierILb1EEEEDaRKT_ENKUlvE_clEv Line | Count | Source | 299 | 13.2k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessGetBlockData(CNode&, (anonymous namespace)::Peer&, CInv const&)::$_0::operator()() const Unexecuted instantiation: net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessGetBlockData(CNode&, (anonymous namespace)::Peer&, CInv const&)::$_1::operator()() const net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_0::operator()() const Line | Count | Source | 299 | 11 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_3::operator()() const Line | Count | Source | 299 | 6 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_4::operator()() const Line | Count | Source | 299 | 19 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_5::operator()() const net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_6::operator()() const Line | Count | Source | 299 | 1 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessHeadersMessage(CNode&, (anonymous namespace)::Peer&, std::vector<CBlockHeader, std::allocator<CBlockHeader>>&&, bool)::$_0::operator()() const Line | Count | Source | 299 | 7.22k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::HandleUnconnectingHeaders(CNode&, (anonymous namespace)::Peer&, std::vector<CBlockHeader, std::allocator<CBlockHeader>> const&)::$_0::operator()() const Line | Count | Source | 299 | 199 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::HandleUnconnectingHeaders(CNode&, (anonymous namespace)::Peer&, std::vector<CBlockHeader, std::allocator<CBlockHeader>> const&)::$_1::operator()() const Line | Count | Source | 299 | 199 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_7::operator()() const Line | Count | Source | 299 | 37.1k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
net_processing.cpp:(anonymous namespace)::PeerManagerImpl::ProcessMessage((anonymous namespace)::Peer&, CNode&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, DataStream&, std::chrono::time_point<NodeClock, std::chrono::duration<long, std::ratio<1l, 1000000000l>>>, std::atomic<bool> const&)::$_8::operator()() const Line | Count | Source | 299 | 126 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockstorage.cpp:node::BlockManager::WriteBlockIndexDB()::$_0::operator()() const Line | Count | Source | 299 | 3.36k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockstorage.cpp:node::BlockManager::ScanAndUnlinkAlreadyPrunedFiles()::$_0::operator()() const Line | Count | Source | 299 | 1.16k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockstorage.cpp:node::BlockManager::ReadBlockUndo(CBlockUndo&, CBlockIndex const&) const::$_0::operator()() const Line | Count | Source | 299 | 36.8k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockstorage.cpp:node::BlockManager::ReadBlock(CBlock&, CBlockIndex const&) const::$_0::operator()() const Line | Count | Source | 299 | 122k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockstorage.cpp:node::ImportBlocks(ChainstateManager&, std::span<fs::path const, 18446744073709551615ul>)::$_0::operator()() const Line | Count | Source | 299 | 13 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: interfaces.cpp:node::(anonymous namespace)::NodeImpl::getBestBlockHash()::'lambda'()::operator()() const interfaces.cpp:node::(anonymous namespace)::ChainImpl::getHeight()::'lambda'()::operator()() const Line | Count | Source | 299 | 2.34k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
interfaces.cpp:node::(anonymous namespace)::ChainImpl::blockFilterMatchesAny(BlockFilterType, uint256 const&, std::unordered_set<std::vector<unsigned char, std::allocator<unsigned char>>, ByteVectorHash, std::equal_to<std::vector<unsigned char, std::allocator<unsigned char>>>, std::allocator<std::vector<unsigned char, std::allocator<unsigned char>>>> const&)::'lambda'()::operator()() const Line | Count | Source | 299 | 615 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
interfaces.cpp:node::(anonymous namespace)::ChainImpl::waitForNotificationsIfTipChanged(uint256 const&)::'lambda'()::operator()() const Line | Count | Source | 299 | 6.53k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: interfaces.cpp:node::(anonymous namespace)::MinerImpl::createNewBlock(node::BlockCreateOptions const&, bool)::'lambda'()::operator()() const miner.cpp:node::RegenerateCommitments(CBlock&, ChainstateManager&)::$_0::operator()() const Line | Count | Source | 299 | 7.37k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
warnings.cpp:node::Warnings::Set(std::variant<kernel::Warning, node::Warning>, bilingual_str)::$_0::operator()() const Line | Count | Source | 299 | 162 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
warnings.cpp:node::Warnings::Unset(std::variant<kernel::Warning, node::Warning>)::$_0::operator()() const Line | Count | Source | 299 | 102k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
block_policy_estimator.cpp:FeeFilterRounder::round(long)::$_0::operator()() const Line | Count | Source | 299 | 97 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
rest.cpp:rest_deploymentinfo(std::any const&, HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
rest.cpp:rest_spent_txouts(std::any const&, HTTPRequest*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)::$_0::operator()() const Line | Count | Source | 299 | 630 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:blockToJSON(node::BlockManager&, CBlock const&, CBlockIndex const&, CBlockIndex const&, TxVerbosity, uint256)::$_0::operator()() const Line | Count | Source | 299 | 347 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:blockToJSON(node::BlockManager&, CBlock const&, CBlockIndex const&, CBlockIndex const&, TxVerbosity, uint256)::$_1::operator()() const Line | Count | Source | 299 | 347 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:CreateRolledBackUTXOSnapshot(node::NodeContext&, Chainstate&, CBlockIndex const*, AutoFile&&, fs::path const&, fs::path const&, bool)::$_0::operator()() const Line | Count | Source | 299 | 432 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:CreateUTXOSnapshot(node::NodeContext&, Chainstate&, AutoFile&&, fs::path const&, fs::path const&)::$_0::operator()() const Line | Count | Source | 299 | 37 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:getblockfrompeer()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda'()::operator()() const Line | Count | Source | 299 | 8 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:getblockfrompeer()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda0'()::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
blockchain.cpp:getblockfrompeer()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda1'()::operator()() const Line | Count | Source | 299 | 6 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: blockchain.cpp:scanblocks()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda'()::operator()() const blockchain.cpp:dumptxoutset()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda'()::operator()() const Line | Count | Source | 299 | 14 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
mempool.cpp:submitpackage()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda'()::operator()() const Line | Count | Source | 299 | 112 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
rawtransaction.cpp:getrawtransaction()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda'()::operator()() const Line | Count | Source | 299 | 2 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
rawtransaction.cpp:getrawtransaction()::$_0::operator()(RPCMethod const&, JSONRPCRequest const&) const::'lambda0'()::operator()() const Line | Count | Source | 299 | 5 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:Chainstate::ActivateBestChain(BlockValidationState&, std::shared_ptr<CBlock const>)::$_0::operator()() const Line | Count | Source | 299 | 118k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:Chainstate::InvalidateBlock(BlockValidationState&, CBlockIndex*)::$_0::operator()() const Line | Count | Source | 299 | 172 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::ProcessNewBlock(std::shared_ptr<CBlock const> const&, bool, bool, bool*)::$_0::operator()() const Line | Count | Source | 299 | 114k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::LoadExternalBlockFile(AutoFile&, FlatFilePos*, std::multimap<uint256, FlatFilePos, std::less<uint256>, std::allocator<std::pair<uint256 const, FlatFilePos>>>*)::$_0::operator()() const Line | Count | Source | 299 | 15 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::ActivateSnapshot(AutoFile&, node::SnapshotMetadata const&, bool)::$_1::operator()() const Line | Count | Source | 299 | 38 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::PopulateAndValidateSnapshot(Chainstate&, AutoFile&, node::SnapshotMetadata const&)::$_1::operator()() const Line | Count | Source | 299 | 38 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::PopulateAndValidateSnapshot(Chainstate&, AutoFile&, node::SnapshotMetadata const&)::$_2::operator()() const Line | Count | Source | 299 | 38 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
validation.cpp:ChainstateManager::PopulateAndValidateSnapshot(Chainstate&, AutoFile&, node::SnapshotMetadata const&)::$_3::operator()() const Line | Count | Source | 299 | 38 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Unexecuted instantiation: validation.cpp:ChainstateManager::PopulateAndValidateSnapshot(Chainstate&, AutoFile&, node::SnapshotMetadata const&)::$_4::operator()() const validation.cpp:ChainstateManager::PopulateAndValidateSnapshot(Chainstate&, AutoFile&, node::SnapshotMetadata const&)::$_5::operator()() const Line | Count | Source | 299 | 22 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
scriptpubkeyman.cpp:wallet::LegacyDataSPKM::MigrateToDescriptor()::$_0::operator()() const Line | Count | Source | 299 | 38 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
scriptpubkeyman.cpp:wallet::LegacyDataSPKM::MigrateToDescriptor()::$_1::operator()() const Line | Count | Source | 299 | 66 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
scriptpubkeyman.cpp:wallet::LegacyDataSPKM::MigrateToDescriptor()::$_2::operator()() const Line | Count | Source | 299 | 17 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::RemoveWallet(wallet::WalletContext&, std::shared_ptr<wallet::CWallet> const&, std::optional<bool>, std::vector<bilingual_str, std::allocator<bilingual_str>>&)::$_0::operator()() const Line | Count | Source | 299 | 872 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::LoadWallet(wallet::WalletContext&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::optional<bool>, wallet::DatabaseOptions const&, wallet::DatabaseStatus&, bilingual_str&, std::vector<bilingual_str, std::allocator<bilingual_str>>&)::$_0::operator()[abi:cxx11]() const Line | Count | Source | 299 | 235 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::LoadWallet(wallet::WalletContext&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::optional<bool>, wallet::DatabaseOptions const&, wallet::DatabaseStatus&, bilingual_str&, std::vector<bilingual_str, std::allocator<bilingual_str>>&)::$_1::operator()() const Line | Count | Source | 299 | 233 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CreateWallet(wallet::WalletContext&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::optional<bool>, wallet::DatabaseOptions&, wallet::DatabaseStatus&, bilingual_str&, std::vector<bilingual_str, std::allocator<bilingual_str>>&)::$_0::operator()() const Line | Count | Source | 299 | 579 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::BlockUntilSyncedToCurrentChain() const::$_0::operator()() const Line | Count | Source | 299 | 6.53k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::RescanFromTime(long, wallet::WalletRescanReserver const&, bool)::$_0::operator()() const Line | Count | Source | 299 | 613 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::ScanForWalletTransactions(uint256 const&, int, std::optional<int>, wallet::WalletRescanReserver const&, bool, bool)::$_0::operator()() const Line | Count | Source | 299 | 689 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::ScanForWalletTransactions(uint256 const&, int, std::optional<int>, wallet::WalletRescanReserver const&, bool, bool)::$_1::operator()() const Line | Count | Source | 299 | 74.2k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::ScanForWalletTransactions(uint256 const&, int, std::optional<int>, wallet::WalletRescanReserver const&, bool, bool)::$_2::operator()() const Line | Count | Source | 299 | 73.5k | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::ScanForWalletTransactions(uint256 const&, int, std::optional<int>, wallet::WalletRescanReserver const&, bool, bool)::$_3::operator()() const Line | Count | Source | 299 | 687 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::LoadExisting(wallet::WalletContext&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, std::unique_ptr<wallet::WalletDatabase, std::default_delete<wallet::WalletDatabase>>, bilingual_str&, std::vector<bilingual_str, std::allocator<bilingual_str>>&)::$_0::operator()() const Line | Count | Source | 299 | 341 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::postInitProcess()::$_0::operator()() const Line | Count | Source | 299 | 876 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
wallet.cpp:wallet::CWallet::BackupWallet(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&) const::$_0::operator()() const Line | Count | Source | 299 | 113 | #define WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
|
300 | | |
301 | | #endif // BITCOIN_SYNC_H |