1 | // Copyright (c) 2012 The LevelDB Authors. All rights reserved. |
2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. See the AUTHORS file for names of contributors. |
4 | |
5 | #ifndef STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ |
6 | #define STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ |
7 | |
8 | // Use Clang's thread safety analysis annotations when available. In other |
9 | // environments, the macros receive empty definitions. |
10 | // Usage documentation: https://clang.llvm.org/docs/ThreadSafetyAnalysis.html |
11 | |
12 | #if !defined(THREAD_ANNOTATION_ATTRIBUTE__) |
13 | |
14 | #if defined(__clang__) |
15 | |
16 | #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) |
17 | #else |
18 | #define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op |
19 | #endif |
20 | |
21 | #endif // !defined(THREAD_ANNOTATION_ATTRIBUTE__) |
22 | |
23 | #ifndef GUARDED_BY |
24 | #define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) |
25 | #endif |
26 | |
27 | #ifndef PT_GUARDED_BY |
28 | #define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) |
29 | #endif |
30 | |
31 | #ifndef ACQUIRED_AFTER |
32 | #define ACQUIRED_AFTER(...) \ |
33 | THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) |
34 | #endif |
35 | |
36 | #ifndef ACQUIRED_BEFORE |
37 | #define ACQUIRED_BEFORE(...) \ |
38 | THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) |
39 | #endif |
40 | |
41 | #ifndef EXCLUSIVE_LOCKS_REQUIRED |
42 | #define EXCLUSIVE_LOCKS_REQUIRED(...) \ |
43 | THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) |
44 | #endif |
45 | |
46 | #ifndef SHARED_LOCKS_REQUIRED |
47 | #define SHARED_LOCKS_REQUIRED(...) \ |
48 | THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) |
49 | #endif |
50 | |
51 | #ifndef LOCKS_EXCLUDED |
52 | #define LOCKS_EXCLUDED(...) \ |
53 | THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) |
54 | #endif |
55 | |
56 | #ifndef LOCK_RETURNED |
57 | #define LOCK_RETURNED(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) |
58 | #endif |
59 | |
60 | #ifndef LOCKABLE |
61 | #define LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(lockable) |
62 | #endif |
63 | |
64 | #ifndef SCOPED_LOCKABLE |
65 | #define SCOPED_LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) |
66 | #endif |
67 | |
68 | #ifndef EXCLUSIVE_LOCK_FUNCTION |
69 | #define EXCLUSIVE_LOCK_FUNCTION(...) \ |
70 | THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) |
71 | #endif |
72 | |
73 | #ifndef SHARED_LOCK_FUNCTION |
74 | #define SHARED_LOCK_FUNCTION(...) \ |
75 | THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) |
76 | #endif |
77 | |
78 | #ifndef EXCLUSIVE_TRYLOCK_FUNCTION |
79 | #define EXCLUSIVE_TRYLOCK_FUNCTION(...) \ |
80 | THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) |
81 | #endif |
82 | |
83 | #ifndef SHARED_TRYLOCK_FUNCTION |
84 | #define SHARED_TRYLOCK_FUNCTION(...) \ |
85 | THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) |
86 | #endif |
87 | |
88 | #ifndef UNLOCK_FUNCTION |
89 | #define UNLOCK_FUNCTION(...) \ |
90 | THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) |
91 | #endif |
92 | |
93 | #ifndef NO_THREAD_SAFETY_ANALYSIS |
94 | #define NO_THREAD_SAFETY_ANALYSIS \ |
95 | THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) |
96 | #endif |
97 | |
98 | #ifndef ASSERT_EXCLUSIVE_LOCK |
99 | #define ASSERT_EXCLUSIVE_LOCK(...) \ |
100 | THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) |
101 | #endif |
102 | |
103 | #ifndef ASSERT_SHARED_LOCK |
104 | #define ASSERT_SHARED_LOCK(...) \ |
105 | THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) |
106 | #endif |
107 | |
108 | #endif // STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ |
109 | |