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