threadsafety.h raw

   1  // Copyright (c) 2009-2010 Satoshi Nakamoto
   2  // Copyright (c) 2009-present The Bitcoin Core developers
   3  // Distributed under the MIT software license, see the accompanying
   4  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   5  
   6  #ifndef BITCOIN_THREADSAFETY_H
   7  #define BITCOIN_THREADSAFETY_H
   8  
   9  #ifdef __clang__
  10  // TL;DR Add GUARDED_BY(mutex) to member variables. The others are
  11  // rarely necessary. Ex: int nFoo GUARDED_BY(cs_foo);
  12  //
  13  // See https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
  14  // for documentation.  The clang compiler can do advanced static analysis
  15  // of locking when given the -Wthread-safety option.
  16  #define LOCKABLE __attribute__((capability("")))
  17  #define SCOPED_LOCKABLE __attribute__((scoped_lockable))
  18  #define GUARDED_BY(x) __attribute__((guarded_by(x)))
  19  #define PT_GUARDED_BY(x) __attribute__((pt_guarded_by(x)))
  20  #define ACQUIRED_AFTER(...) __attribute__((acquired_after(__VA_ARGS__)))
  21  #define ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__)))
  22  #define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__((acquire_capability(__VA_ARGS__)))
  23  #define SHARED_LOCK_FUNCTION(...) __attribute__((acquire_shared_capability(__VA_ARGS__)))
  24  #define EXCLUSIVE_TRYLOCK_FUNCTION(...) __attribute__((try_acquire_capability(__VA_ARGS__)))
  25  #define SHARED_TRYLOCK_FUNCTION(...) __attribute__((try_acquire_shared_capability(__VA_ARGS__)))
  26  #define UNLOCK_FUNCTION(...) __attribute__((release_capability(__VA_ARGS__)))
  27  #define SHARED_UNLOCK_FUNCTION(...) __attribute__((release_shared_capability(__VA_ARGS__)))
  28  #define LOCK_RETURNED(x) __attribute__((lock_returned(x)))
  29  #define LOCKS_EXCLUDED(...) __attribute__((locks_excluded(__VA_ARGS__)))
  30  #define EXCLUSIVE_LOCKS_REQUIRED(...) __attribute__((requires_capability(__VA_ARGS__)))
  31  #define SHARED_LOCKS_REQUIRED(...) __attribute__((requires_shared_capability(__VA_ARGS__)))
  32  #define NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
  33  #define ASSERT_EXCLUSIVE_LOCK(...) __attribute__((assert_capability(__VA_ARGS__)))
  34  #else
  35  #define LOCKABLE
  36  #define SCOPED_LOCKABLE
  37  #define GUARDED_BY(x)
  38  #define PT_GUARDED_BY(x)
  39  #define ACQUIRED_AFTER(...)
  40  #define ACQUIRED_BEFORE(...)
  41  #define EXCLUSIVE_LOCK_FUNCTION(...)
  42  #define SHARED_LOCK_FUNCTION(...)
  43  #define EXCLUSIVE_TRYLOCK_FUNCTION(...)
  44  #define SHARED_TRYLOCK_FUNCTION(...)
  45  #define UNLOCK_FUNCTION(...)
  46  #define SHARED_UNLOCK_FUNCTION(...)
  47  #define LOCK_RETURNED(x)
  48  #define LOCKS_EXCLUDED(...)
  49  #define EXCLUSIVE_LOCKS_REQUIRED(...)
  50  #define SHARED_LOCKS_REQUIRED(...)
  51  #define NO_THREAD_SAFETY_ANALYSIS
  52  #define ASSERT_EXCLUSIVE_LOCK(...)
  53  #endif // __GNUC__
  54  
  55  #endif // BITCOIN_THREADSAFETY_H
  56