1 #ifndef BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP 2 #define BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP 3 4 #if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) 5 // 6 // This is horrible, but it seems to be the only we can shut up the 7 // "anonymous variadic macros were introduced in C99 [-Wvariadic-macros]" 8 // warning that get spewed out otherwise in non-C++11 mode. 9 // 10 #pragma GCC system_header 11 #endif 12 13 // See https://clang.llvm.org/docs/ThreadSafetyAnalysis.html 14 15 // Un-comment to enable Thread Safety Analysis 16 //#define BOOST_THREAD_ENABLE_THREAD_SAFETY_ANALYSIS 17 18 // Enable thread safety attributes only with clang. 19 // The attributes can be safely erased when compiling with other compilers. 20 #if defined (BOOST_THREAD_ENABLE_THREAD_SAFETY_ANALYSIS) && defined(__clang__) && (!defined(SWIG)) 21 #define BOOST_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) 22 #else 23 #define BOOST_THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op 24 #endif 25 26 #define BOOST_THREAD_CAPABILITY(x) \ 27 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) 28 29 #define BOOST_THREAD_SCOPED_CAPABILITY \ 30 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) 31 32 #define BOOST_THREAD_GUARDED_BY(x) \ 33 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) 34 35 #define BOOST_THREAD_PT_GUARDED_BY(x) \ 36 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) 37 38 #define BOOST_THREAD_ACQUIRED_BEFORE(...) \ 39 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) 40 41 #define BOOST_THREAD_ACQUIRED_AFTER(...) \ 42 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) 43 44 #define BOOST_THREAD_REQUIRES(...) \ 45 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__)) 46 47 #define BOOST_THREAD_REQUIRES_SHARED(...) \ 48 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__)) 49 50 #define BOOST_THREAD_ACQUIRE(...) \ 51 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__)) 52 53 #define BOOST_THREAD_ACQUIRE_SHARED(...) \ 54 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__)) 55 56 #define BOOST_THREAD_RELEASE(...) \ 57 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__)) 58 59 #define BOOST_THREAD_RELEASE_SHARED(...) \ 60 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__)) 61 62 #define BOOST_THREAD_TRY_ACQUIRE(...) \ 63 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__)) 64 65 #define BOOST_THREAD_TRY_ACQUIRE_SHARED(...) \ 66 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__)) 67 68 #define BOOST_THREAD_EXCLUDES(...) \ 69 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) 70 71 #define BOOST_THREAD_ASSERT_CAPABILITY(x) \ 72 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) 73 74 #define BOOST_THREAD_ASSERT_SHARED_CAPABILITY(x) \ 75 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) 76 77 #define BOOST_THREAD_RETURN_CAPABILITY(x) \ 78 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) 79 80 #define BOOST_THREAD_NO_THREAD_SAFETY_ANALYSIS \ 81 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) 82 83 #if defined(__clang__) && (!defined(SWIG)) && defined(__FreeBSD__) 84 #if __has_attribute(no_thread_safety_analysis) 85 #define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis)) 86 #else 87 #define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS 88 #endif 89 #else 90 #define BOOST_THREAD_DISABLE_THREAD_SAFETY_ANALYSIS 91 #endif 92 93 #ifdef USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES 94 // The original version of thread safety analysis the following attribute 95 // definitions. These use a lock-based terminology. They are still in use 96 // by existing thread safety code, and will continue to be supported. 97 98 // Deprecated. 99 #define BOOST_THREAD_PT_GUARDED_VAR \ 100 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_var) 101 102 // Deprecated. 103 #define BOOST_THREAD_GUARDED_VAR \ 104 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(guarded_var) 105 106 // Replaced by REQUIRES 107 #define BOOST_THREAD_EXCLUSIVE_LOCKS_REQUIRED(...) \ 108 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) 109 110 // Replaced by REQUIRES_SHARED 111 #define BOOST_THREAD_SHARED_LOCKS_REQUIRED(...) \ 112 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) 113 114 // Replaced by CAPABILITY 115 #define BOOST_THREAD_LOCKABLE \ 116 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lockable) 117 118 // Replaced by SCOPED_CAPABILITY 119 #define BOOST_THREAD_SCOPED_LOCKABLE \ 120 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) 121 122 // Replaced by ACQUIRE 123 #define BOOST_THREAD_EXCLUSIVE_LOCK_FUNCTION(...) \ 124 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) 125 126 // Replaced by ACQUIRE_SHARED 127 #define BOOST_THREAD_SHARED_LOCK_FUNCTION(...) \ 128 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) 129 130 // Replaced by RELEASE and RELEASE_SHARED 131 #define BOOST_THREAD_UNLOCK_FUNCTION(...) \ 132 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) 133 134 // Replaced by TRY_ACQUIRE 135 #define BOOST_THREAD_EXCLUSIVE_TRYLOCK_FUNCTION(...) \ 136 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) 137 138 // Replaced by TRY_ACQUIRE_SHARED 139 #define BOOST_THREAD_SHARED_TRYLOCK_FUNCTION(...) \ 140 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) 141 142 // Replaced by ASSERT_CAPABILITY 143 #define BOOST_THREAD_ASSERT_EXCLUSIVE_LOCK(...) \ 144 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) 145 146 // Replaced by ASSERT_SHARED_CAPABILITY 147 #define BOOST_THREAD_ASSERT_SHARED_LOCK(...) \ 148 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) 149 150 // Replaced by EXCLUDE_CAPABILITY. 151 #define BOOST_THREAD_LOCKS_EXCLUDED(...) \ 152 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) 153 154 // Replaced by RETURN_CAPABILITY 155 #define BOOST_THREAD_LOCK_RETURNED(x) \ 156 BOOST_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) 157 158 #endif // USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES 159 160 #endif // BOOST_THREAD_DETAIL_THREAD_SAFETY_HPP 161