]>
Commit | Line | Data |
---|---|---|
c043ff79 AK |
1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
2 | // Copyright (c) 2009-2012 The Bitcoin developers | |
3 | // Distributed under the MIT/X11 software license, see the accompanying | |
4 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | |
51ed9ec9 | 5 | |
c043ff79 AK |
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 http://clang.llvm.org/docs/LanguageExtensions.html#threadsafety | |
14 | // for documentation. The clang compiler can do advanced static analysis | |
15 | // of locking when given the -Wthread-safety option. | |
16 | #define LOCKABLE __attribute__ ((lockable)) | |
17 | #define SCOPED_LOCKABLE __attribute__ ((scoped_lockable)) | |
18 | #define GUARDED_BY(x) __attribute__ ((guarded_by(x))) | |
19 | #define GUARDED_VAR __attribute__ ((guarded_var)) | |
20 | #define PT_GUARDED_BY(x) __attribute__ ((pt_guarded_by(x))) | |
21 | #define PT_GUARDED_VAR __attribute__ ((pt_guarded_var)) | |
22 | #define ACQUIRED_AFTER(...) __attribute__ ((acquired_after(__VA_ARGS__))) | |
23 | #define ACQUIRED_BEFORE(...) __attribute__ ((acquired_before(__VA_ARGS__))) | |
24 | #define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__ ((exclusive_lock_function(__VA_ARGS__))) | |
25 | #define SHARED_LOCK_FUNCTION(...) __attribute__ ((shared_lock_function(__VA_ARGS__))) | |
26 | #define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__ ((exclusive_trylock_function(__VA_ARGS__))) | |
27 | #define SHARED_TRYLOCK_FUNCTION(...) __attribute__ ((shared_trylock_function(__VA_ARGS__))) | |
28 | #define UNLOCK_FUNCTION(...) __attribute__ ((unlock_function(__VA_ARGS__))) | |
29 | #define LOCK_RETURNED(x) __attribute__ ((lock_returned(x))) | |
30 | #define LOCKS_EXCLUDED(...) __attribute__ ((locks_excluded(__VA_ARGS__))) | |
31 | #define EXCLUSIVE_LOCKS_REQUIRED(...) __attribute__ ((exclusive_locks_required(__VA_ARGS__))) | |
32 | #define SHARED_LOCKS_REQUIRED(...) __attribute__ ((shared_locks_required(__VA_ARGS__))) | |
33 | #define NO_THREAD_SAFETY_ANALYSIS __attribute__ ((no_thread_safety_analysis)) | |
34 | #else | |
35 | #define LOCKABLE | |
36 | #define SCOPED_LOCKABLE | |
37 | #define GUARDED_BY(x) | |
38 | #define GUARDED_VAR | |
39 | #define PT_GUARDED_BY(x) | |
40 | #define PT_GUARDED_VAR | |
41 | #define ACQUIRED_AFTER(...) | |
42 | #define ACQUIRED_BEFORE(...) | |
43 | #define EXCLUSIVE_LOCK_FUNCTION(...) | |
44 | #define SHARED_LOCK_FUNCTION(...) | |
45 | #define EXCLUSIVE_TRYLOCK_FUNCTION(...) | |
46 | #define SHARED_TRYLOCK_FUNCTION(...) | |
47 | #define UNLOCK_FUNCTION(...) | |
48 | #define LOCK_RETURNED(x) | |
49 | #define LOCKS_EXCLUDED(...) | |
50 | #define EXCLUSIVE_LOCKS_REQUIRED(...) | |
51 | #define SHARED_LOCKS_REQUIRED(...) | |
52 | #define NO_THREAD_SAFETY_ANALYSIS | |
53 | #endif // __GNUC__ | |
54 | #endif // BITCOIN_THREADSAFETY_H |