thread_annotations.h 3.1 KB

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