Bitcoin Core 31.99.0
P2P Digital Currency
threadsafety.h
Go to the documentation of this file.
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_THREADSAFETY_H
7#define BITCOIN_THREADSAFETY_H
8
9#ifdef __clang__
10// TL;DR Add GUARDED_BY(mutex) to member variables. The others are
11// rarely necessary. Ex: int nFoo GUARDED_BY(cs_foo);
12//
13// See https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
14// for documentation. The clang compiler can do advanced static analysis
15// of locking when given the -Wthread-safety option.
16#define LOCKABLE __attribute__((capability("")))
17#define SCOPED_LOCKABLE __attribute__((scoped_lockable))
18#define GUARDED_BY(x) __attribute__((guarded_by(x)))
19#define PT_GUARDED_BY(x) __attribute__((pt_guarded_by(x)))
20#define ACQUIRED_AFTER(...) __attribute__((acquired_after(__VA_ARGS__)))
21#define ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__)))
22#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__((acquire_capability(__VA_ARGS__)))
23#define SHARED_LOCK_FUNCTION(...) __attribute__((acquire_shared_capability(__VA_ARGS__)))
24#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__((try_acquire_capability(__VA_ARGS__)))
25#define SHARED_TRYLOCK_FUNCTION(...) __attribute__((try_acquire_shared_capability(__VA_ARGS__)))
26#define UNLOCK_FUNCTION(...) __attribute__((release_capability(__VA_ARGS__)))
27#define SHARED_UNLOCK_FUNCTION(...) __attribute__((release_shared_capability(__VA_ARGS__)))
28#define LOCK_RETURNED(x) __attribute__((lock_returned(x)))
29#define LOCKS_EXCLUDED(...) __attribute__((locks_excluded(__VA_ARGS__)))
30#define EXCLUSIVE_LOCKS_REQUIRED(...) __attribute__((requires_capability(__VA_ARGS__)))
31#define SHARED_LOCKS_REQUIRED(...) __attribute__((requires_shared_capability(__VA_ARGS__)))
32#define NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
33#define ASSERT_EXCLUSIVE_LOCK(...) __attribute__((assert_capability(__VA_ARGS__)))
34#else
35#define LOCKABLE
36#define SCOPED_LOCKABLE
37#define GUARDED_BY(x)
38#define PT_GUARDED_BY(x)
39#define ACQUIRED_AFTER(...)
40#define ACQUIRED_BEFORE(...)
41#define EXCLUSIVE_LOCK_FUNCTION(...)
42#define SHARED_LOCK_FUNCTION(...)
43#define EXCLUSIVE_TRYLOCK_FUNCTION(...)
44#define SHARED_TRYLOCK_FUNCTION(...)
45#define UNLOCK_FUNCTION(...)
46#define SHARED_UNLOCK_FUNCTION(...)
47#define LOCK_RETURNED(x)
48#define LOCKS_EXCLUDED(...)
49#define EXCLUSIVE_LOCKS_REQUIRED(...)
50#define SHARED_LOCKS_REQUIRED(...)
51#define NO_THREAD_SAFETY_ANALYSIS
52#define ASSERT_EXCLUSIVE_LOCK(...)
53#endif // __GNUC__
54
55#endif // BITCOIN_THREADSAFETY_H