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