1 // Copyright 2018 The Fuchsia 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.
4 
5 #ifndef LIB_FIT_THREAD_SAFETY_H_
6 #define LIB_FIT_THREAD_SAFETY_H_
7 
8 // Thread-safety annotations.
9 // Currently these are only supported on Clang.
10 #if defined(__clang__) &&                                \
11     defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS) && \
12     __has_attribute(acquire_capability)
13 #define FIT_THREAD_ANNOTATION(x) __attribute__((x))
14 #else
15 #define FIT_THREAD_ANNOTATION(x)
16 #endif
17 #define FIT_CAPABILITY(x) FIT_THREAD_ANNOTATION(__capability__(x))
18 #define FIT_GUARDED(x) FIT_THREAD_ANNOTATION(__guarded_by__(x))
19 #define FIT_ACQUIRE(...) FIT_THREAD_ANNOTATION(__acquire_capability__(__VA_ARGS__))
20 #define FIT_TRY_ACQUIRE(...) FIT_THREAD_ANNOTATION(__try_acquire_capability__(__VA_ARGS__))
21 #define FIT_ACQUIRED_BEFORE(...) FIT_THREAD_ANNOTATION(__acquired_before__(__VA_ARGS__))
22 #define FIT_ACQUIRED_AFTER(...) FIT_THREAD_ANNOTATION(__acquired_after__(__VA_ARGS__))
23 #define FIT_RELEASE(...) FIT_THREAD_ANNOTATION(__release_capability__(__VA_ARGS__))
24 #define FIT_REQUIRES(...) FIT_THREAD_ANNOTATION(__requires_capability__(__VA_ARGS__))
25 #define FIT_EXCLUDES(...) FIT_THREAD_ANNOTATION(__locks_excluded__(__VA_ARGS__))
26 #define FIT_RETURN_CAPABILITY(x) FIT_THREAD_ANNOTATION(__lock_returned__(x))
27 #define FIT_SCOPED_CAPABILITY FIT_THREAD_ANNOTATION(__scoped_lockable__)
28 #define FIT_NO_THREAD_SAFETY_ANALYSIS FIT_THREAD_ANNOTATION(__no_thread_safety_analysis__)
29 
30 #endif // LIB_FIT_THREAD_SAFETY_H_
31