/ src / leveldb / port / thread_annotations.h
thread_annotations.h
  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_