/ src / threadsafety.h
threadsafety.h
 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