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