RawSpeed
fast raw decoding library
Loading...
Searching...
No Matches
ThreadSafetyAnalysis.h
Go to the documentation of this file.
1#pragma once
2
3// see https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutexheader
4
5#ifndef THREAD_SAFETY_ANALYSIS_MUTEX_H
6#define THREAD_SAFETY_ANALYSIS_MUTEX_H
7
8#pragma GCC system_header
9
10// Enable thread safety attributes only with clang.
11// The attributes can be safely erased when compiling with other compilers.
12#if defined(__clang__) && (!defined(SWIG))
13#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
14#else
15#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op
16#endif
17
18#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(capability(x))
19
20#define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
21
22#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
23
24#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
25
26#define ACQUIRED_BEFORE(...) \
27 THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__))
28
29#define ACQUIRED_AFTER(...) \
30 THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__))
31
32#define REQUIRES(...) \
33 THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__))
34
35#define REQUIRES_SHARED(...) \
36 THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__))
37
38#define ACQUIRE(...) \
39 THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__))
40
41#define ACQUIRE_SHARED(...) \
42 THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__))
43
44#define RELEASE(...) \
45 THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__))
46
47#define RELEASE_SHARED(...) \
48 THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__))
49
50#define TRY_ACQUIRE(...) \
51 THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__))
52
53#define TRY_ACQUIRE_SHARED(...) \
54 THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__))
55
56#define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
57
58#define ASSERT_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x))
59
60#define ASSERT_SHARED_CAPABILITY(x) \
61 THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x))
62
63#define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
64
65#define NO_THREAD_SAFETY_ANALYSIS \
66 THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
67
68#ifdef USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES
69// The original version of thread safety analysis the following attribute
70// definitions. These use a lock-based terminology. They are still in use
71// by existing thread safety code, and will continue to be supported.
72
73// Deprecated.
74#define PT_GUARDED_VAR THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_var)
75
76// Deprecated.
77#define GUARDED_VAR THREAD_ANNOTATION_ATTRIBUTE__(guarded_var)
78
79// Replaced by REQUIRES
80#define EXCLUSIVE_LOCKS_REQUIRED(...) \
81 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))
82
83// Replaced by REQUIRES_SHARED
84#define SHARED_LOCKS_REQUIRED(...) \
85 THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))
86
87// Replaced by CAPABILITY
88#define LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(lockable)
89
90// Replaced by SCOPED_CAPABILITY
91#define SCOPED_LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
92
93// Replaced by ACQUIRE
94#define EXCLUSIVE_LOCK_FUNCTION(...) \
95 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))
96
97// Replaced by ACQUIRE_SHARED
98#define SHARED_LOCK_FUNCTION(...) \
99 THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))
100
101// Replaced by RELEASE and RELEASE_SHARED
102#define UNLOCK_FUNCTION(...) \
103 THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))
104
105// Replaced by TRY_ACQUIRE
106#define EXCLUSIVE_TRYLOCK_FUNCTION(...) \
107 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))
108
109// Replaced by TRY_ACQUIRE_SHARED
110#define SHARED_TRYLOCK_FUNCTION(...) \
111 THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))
112
113// Replaced by ASSERT_CAPABILITY
114#define ASSERT_EXCLUSIVE_LOCK(...) \
115 THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__))
116
117// Replaced by ASSERT_SHARED_CAPABILITY
118#define ASSERT_SHARED_LOCK(...) \
119 THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__))
120
121// Replaced by EXCLUDE_CAPABILITY.
122#define LOCKS_EXCLUDED(...) \
123 THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
124
125// Replaced by RETURN_CAPABILITY
126#define LOCK_RETURNED(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
127
128#endif // USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES
129
130#endif // THREAD_SAFETY_ANALYSIS_MUTEX_H