Clang Project

clang_source_code/test/SemaCXX/thread-safety-annotations.h
1// Macros to enable testing of both variants of the thread safety analysis.
2
3#if USE_CAPABILITY
4#define LOCKABLE                        __attribute__((capability("mutex")))
5#define ASSERT_EXCLUSIVE_LOCK(...)      __attribute__((assert_capability(__VA_ARGS__)))
6#define ASSERT_SHARED_LOCK(...)         __attribute__((assert_shared_capability(__VA_ARGS__)))
7#define EXCLUSIVE_LOCK_FUNCTION(...)    __attribute__((acquire_capability(__VA_ARGS__)))
8#define SHARED_LOCK_FUNCTION(...)       __attribute__((acquire_shared_capability(__VA_ARGS__)))
9#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__((try_acquire_capability(__VA_ARGS__)))
10#define SHARED_TRYLOCK_FUNCTION(...)    __attribute__((try_acquire_shared_capability(__VA_ARGS__)))
11#define EXCLUSIVE_LOCKS_REQUIRED(...)   __attribute__((requires_capability(__VA_ARGS__)))
12#define SHARED_LOCKS_REQUIRED(...)      __attribute__((requires_shared_capability(__VA_ARGS__)))
13#else
14#define LOCKABLE                        __attribute__((lockable))
15#define ASSERT_EXCLUSIVE_LOCK(...)      __attribute__((assert_exclusive_lock(__VA_ARGS__)))
16#define ASSERT_SHARED_LOCK(...)         __attribute__((assert_shared_lock(__VA_ARGS__)))
17#define EXCLUSIVE_LOCK_FUNCTION(...)    __attribute__((exclusive_lock_function(__VA_ARGS__)))
18#define SHARED_LOCK_FUNCTION(...)       __attribute__((shared_lock_function(__VA_ARGS__)))
19#define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__((exclusive_trylock_function(__VA_ARGS__)))
20#define SHARED_TRYLOCK_FUNCTION(...)    __attribute__((shared_trylock_function(__VA_ARGS__)))
21#define EXCLUSIVE_LOCKS_REQUIRED(...)   __attribute__((exclusive_locks_required(__VA_ARGS__)))
22#define SHARED_LOCKS_REQUIRED(...)      __attribute__((shared_locks_required(__VA_ARGS__)))
23#endif
24
25// Lock semantics only
26#define UNLOCK_FUNCTION(...)            __attribute__((unlock_function(__VA_ARGS__)))
27#define GUARDED_VAR                     __attribute__((guarded_var))
28#define PT_GUARDED_VAR                  __attribute__((pt_guarded_var))
29
30// Capabilities only
31#define EXCLUSIVE_UNLOCK_FUNCTION(...)  __attribute__((release_capability(__VA_ARGS__)))
32#define SHARED_UNLOCK_FUNCTION(...)     __attribute__((release_shared_capability(__VA_ARGS__)))
33#define GUARDED_BY(x)                   __attribute__((guarded_by(x)))
34#define PT_GUARDED_BY(x)                __attribute__((pt_guarded_by(x)))
35
36// Common
37#define SCOPED_LOCKABLE                 __attribute__((scoped_lockable))
38#define ACQUIRED_AFTER(...)             __attribute__((acquired_after(__VA_ARGS__)))
39#define ACQUIRED_BEFORE(...)            __attribute__((acquired_before(__VA_ARGS__)))
40#define LOCK_RETURNED(x)                __attribute__((lock_returned(x)))
41#define LOCKS_EXCLUDED(...)             __attribute__((locks_excluded(__VA_ARGS__)))
42#define NO_THREAD_SAFETY_ANALYSIS       __attribute__((no_thread_safety_analysis))
43