![]() |
Bitcoin Core 31.0.0
P2P Digital Currency
|
#include <threadsafety.h>#include <util/macros.h>#include <cassert>#include <condition_variable>#include <mutex>#include <string>#include <thread>Go to the source code of this file.
Classes | |
| class | AnnotatedMixin< PARENT > |
| Template mixin that adds -Wthread-safety locking annotations and lock order checking to a subset of the mutex API. More... | |
| class | GlobalMutex |
| Different type to mark Mutex at global scope. More... | |
| class | UniqueLock< MutexType > |
| Wrapper around std::unique_lock style lock for MutexType. More... | |
| class | UniqueLock< MutexType >::reverse_lock |
| An RAII-style reverse lock. More... | |
Macros | |
| #define | AssertLockHeld(cs) AssertLockHeldInternal(#cs, __FILE__, __LINE__, &cs) |
| #define | AssertLockNotHeld(cs) AssertLockNotHeldInline(#cs, __FILE__, __LINE__, &cs) |
| #define | REVERSE_LOCK(g, cs) typename std::decay<decltype(g)>::type::reverse_lock UNIQUE_NAME(revlock)(g, cs, #cs, __FILE__, __LINE__) |
| #define | LOCK(cs) UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) |
| #define | LOCK2(cs1, cs2) |
| #define | LOCK_ARGS(cs) MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__ |
| #define | TRY_LOCK(cs, name) UniqueLock name(LOCK_ARGS(cs), true) |
| #define | WAIT_LOCK(cs, name) UniqueLock name(LOCK_ARGS(cs)) |
| #define | WITH_LOCK(cs, code) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
| Run code while locking a mutex. | |
Typedefs | |
| using | RecursiveMutex = AnnotatedMixin<std::recursive_mutex> |
| Wrapped mutex: supports recursive locking, but no waiting TODO: We should move away from using the recursive lock by default. | |
| using | Mutex = AnnotatedMixin<std::mutex> |
| Wrapped mutex: supports waiting but not recursive locking. | |
| #define LOCK | ( | cs | ) | UniqueLock UNIQUE_NAME(criticalblock)(MaybeCheckNotHeld(cs), #cs, __FILE__, __LINE__) |
| #define WITH_LOCK | ( | cs, | |
| code ) (MaybeCheckNotHeld(cs), [&]() -> decltype(auto) { LOCK(cs); code; }()) |
Run code while locking a mutex.
Examples:
WITH_LOCK(cs, shared_val = shared_val + 1);
int val = WITH_LOCK(cs, return shared_val);
Note:
Since the return type deduction follows that of decltype(auto), while the deduced type of:
WITH_LOCK(cs, int i = 1; return i);
is int, the deduced type of:
WITH_LOCK(cs, int j = 1; return (j));
is &int, a reference to a local variable
The above is detectable at compile-time with the -Wreturn-local-addr flag in gcc and the -Wreturn-stack-address flag in clang, both enabled by default.
| using Mutex = AnnotatedMixin<std::mutex> |
| using RecursiveMutex = AnnotatedMixin<std::recursive_mutex> |
|
inline |
|
inline |
|
inline |