thread_annotations.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
  44. #endif
  45. #ifndef LOCKABLE
  46. #define LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(lockable)
  47. #endif
  48. #ifndef SCOPED_LOCKABLE
  49. #define SCOPED_LOCKABLE THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
  50. #endif
  51. #ifndef EXCLUSIVE_LOCK_FUNCTION
  52. #define EXCLUSIVE_LOCK_FUNCTION(...) \
  53. THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))
  54. #endif
  55. #ifndef SHARED_LOCK_FUNCTION
  56. #define SHARED_LOCK_FUNCTION(...) \
  57. THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))
  58. #endif
  59. #ifndef EXCLUSIVE_TRYLOCK_FUNCTION
  60. #define EXCLUSIVE_TRYLOCK_FUNCTION(...) \
  61. THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))
  62. #endif
  63. #ifndef SHARED_TRYLOCK_FUNCTION
  64. #define SHARED_TRYLOCK_FUNCTION(...) \
  65. THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))
  66. #endif
  67. #ifndef UNLOCK_FUNCTION
  68. #define UNLOCK_FUNCTION(...) \
  69. THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))
  70. #endif
  71. #ifndef NO_THREAD_SAFETY_ANALYSIS
  72. #define NO_THREAD_SAFETY_ANALYSIS \
  73. THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
  74. #endif
  75. #ifndef ASSERT_EXCLUSIVE_LOCK
  76. #define ASSERT_EXCLUSIVE_LOCK(...) \
  77. THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__))
  78. #endif
  79. #ifndef ASSERT_SHARED_LOCK
  80. #define ASSERT_SHARED_LOCK(...) \
  81. THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__))
  82. #endif
  83. #endif // STORAGE_LEVELDB_PORT_THREAD_ANNOTATIONS_H_