1 // Copyright (c) 2012 The LevelDB 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. See the AUTHORS file for names of contributors. 4 5 #ifndef STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ 6 #define STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ 7 8 // Use Clang's thread safety analysis annotations when available. In other 9 // environments, the macros receive empty definitions. 10 // Usage documentation: https://clang.llvm.org/docs/ThreadSafetyAnalysis.html 11 12 #if !defined(THREAD_ANNOTATION_ATTRIBUTE__) 13 14 #if defined(__clang__) 15 16 #define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) 17 #else 18 #define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op 19 #endif 20 21 #endif // !defined(THREAD_ANNOTATION_ATTRIBUTE__) 22 23 #ifndef GUARDED_BY 24 #define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) 25 #endif 26 27 #ifndef PT_GUARDED_BY 28 #define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) 29 #endif 30 31 #ifndef ACQUIRED_AFTER 32 #define ACQUIRED_AFTER(...) \ 33 THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) 34 #endif 35 36 #ifndef ACQUIRED_BEFORE 37 #define ACQUIRED_BEFORE(...) \ 38 THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) 39 #endif 40 41 #ifndef EXCLUSIVE_LOCKS_REQUIRED 42 #define EXCLUSIVE_LOCKS_REQUIRED(...) \ 43 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) 44 #endif 45 46 #ifndef SHARED_LOCKS_REQUIRED 47 #define SHARED_LOCKS_REQUIRED(...) \ 48 THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) 49 #endif 50 51 #ifndef LOCKS_EXCLUDED 52 #define LOCKS_EXCLUDED(...) \ 53 THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) 54 #endif 55 56 #ifndef LOCK_RETURNED 57 #define LOCK_RETURNED(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) 58 #endif 59 60 #ifndef LOCKABLE 61 #define LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(lockable) 62 #endif 63 64 #ifndef SCOPED_LOCKABLE 65 #define SCOPED_LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) 66 #endif 67 68 #ifndef EXCLUSIVE_LOCK_FUNCTION 69 #define EXCLUSIVE_LOCK_FUNCTION(...) \ 70 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) 71 #endif 72 73 #ifndef SHARED_LOCK_FUNCTION 74 #define SHARED_LOCK_FUNCTION(...) \ 75 THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) 76 #endif 77 78 #ifndef EXCLUSIVE_TRYLOCK_FUNCTION 79 #define EXCLUSIVE_TRYLOCK_FUNCTION(...) \ 80 THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) 81 #endif 82 83 #ifndef SHARED_TRYLOCK_FUNCTION 84 #define SHARED_TRYLOCK_FUNCTION(...) \ 85 THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) 86 #endif 87 88 #ifndef UNLOCK_FUNCTION 89 #define UNLOCK_FUNCTION(...) \ 90 THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) 91 #endif 92 93 #ifndef NO_THREAD_SAFETY_ANALYSIS 94 #define NO_THREAD_SAFETY_ANALYSIS \ 95 THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) 96 #endif 97 98 #ifndef ASSERT_EXCLUSIVE_LOCK 99 #define ASSERT_EXCLUSIVE_LOCK(...) \ 100 THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) 101 #endif 102 103 #ifndef ASSERT_SHARED_LOCK 104 #define ASSERT_SHARED_LOCK(...) \ 105 THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) 106 #endif 107 108 #endif // STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_ 109