]>
Commit | Line | Data |
---|---|---|
c043ff79 | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2012 The Bitcoin Core developers |
78253fcb | 3 | // Distributed under the MIT software license, see the accompanying |
c043ff79 | 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. | |
20e01b1a PW |
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)) | |
c043ff79 AK |
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 | |
20e01b1a | 53 | #endif // __GNUC__ |
093303a8 | 54 | |
20e01b1a | 55 | #endif // BITCOIN_THREADSAFETY_H |