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