tsan: add an addition macro

Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15713)
This commit is contained in:
Pauli 2021-06-17 12:36:33 +10:00 committed by Pauli
parent 75cce8ddee
commit b0b456f8c8

View File

@ -56,8 +56,7 @@
# define TSAN_QUALIFIER _Atomic # define TSAN_QUALIFIER _Atomic
# define tsan_load(ptr) atomic_load_explicit((ptr), memory_order_relaxed) # define tsan_load(ptr) atomic_load_explicit((ptr), memory_order_relaxed)
# define tsan_store(ptr, val) atomic_store_explicit((ptr), (val), memory_order_relaxed) # define tsan_store(ptr, val) atomic_store_explicit((ptr), (val), memory_order_relaxed)
# define tsan_counter(ptr) atomic_fetch_add_explicit((ptr), 1, memory_order_relaxed) # define tsan_add(ptr, n) atomic_fetch_add_explicit((ptr), (n), memory_order_relaxed)
# define tsan_decr(ptr) atomic_fetch_add_explicit((ptr), -1, memory_order_relaxed)
# define tsan_ld_acq(ptr) atomic_load_explicit((ptr), memory_order_acquire) # define tsan_ld_acq(ptr) atomic_load_explicit((ptr), memory_order_acquire)
# define tsan_st_rel(ptr, val) atomic_store_explicit((ptr), (val), memory_order_release) # define tsan_st_rel(ptr, val) atomic_store_explicit((ptr), (val), memory_order_release)
# endif # endif
@ -69,8 +68,7 @@
# define TSAN_QUALIFIER volatile # define TSAN_QUALIFIER volatile
# define tsan_load(ptr) __atomic_load_n((ptr), __ATOMIC_RELAXED) # define tsan_load(ptr) __atomic_load_n((ptr), __ATOMIC_RELAXED)
# define tsan_store(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELAXED) # define tsan_store(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELAXED)
# define tsan_counter(ptr) __atomic_fetch_add((ptr), 1, __ATOMIC_RELAXED) # define tsan_add(ptr, n) __atomic_fetch_add((ptr), (n), __ATOMIC_RELAXED)
# define tsan_decr(ptr) __atomic_fetch_add((ptr), -1, __ATOMIC_RELAXED)
# define tsan_ld_acq(ptr) __atomic_load_n((ptr), __ATOMIC_ACQUIRE) # define tsan_ld_acq(ptr) __atomic_load_n((ptr), __ATOMIC_ACQUIRE)
# define tsan_st_rel(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELEASE) # define tsan_st_rel(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_RELEASE)
# endif # endif
@ -113,13 +111,10 @@
# pragma intrinsic(_InterlockedExchangeAdd) # pragma intrinsic(_InterlockedExchangeAdd)
# ifdef _WIN64 # ifdef _WIN64
# pragma intrinsic(_InterlockedExchangeAdd64) # pragma intrinsic(_InterlockedExchangeAdd64)
# define tsan_counter(ptr) (sizeof(*(ptr)) == 8 ? _InterlockedExchangeAdd64((ptr), 1) \ # define tsan_add(ptr, n) (sizeof(*(ptr)) == 8 ? _InterlockedExchangeAdd64((ptr), (n)) \
: _InterlockedExchangeAdd((ptr), 1)) : _InterlockedExchangeAdd((ptr), (n)))
# define tsan_decr(ptr) (sizeof(*(ptr)) == 8 ? _InterlockedExchangeAdd64((ptr), -1) \
: _InterlockedExchangeAdd((ptr), -1))
# else # else
# define tsan_counter(ptr) _InterlockedExchangeAdd((ptr), 1) # define tsan_add(ptr, n) _InterlockedExchangeAdd((ptr), (n))
# define tsan_decr(ptr) _InterlockedExchangeAdd((ptr), -1)
# endif # endif
# if !defined(_ISO_VOLATILE) # if !defined(_ISO_VOLATILE)
# define tsan_ld_acq(ptr) (*(ptr)) # define tsan_ld_acq(ptr) (*(ptr))
@ -133,8 +128,7 @@
# define TSAN_QUALIFIER volatile # define TSAN_QUALIFIER volatile
# define tsan_load(ptr) (*(ptr)) # define tsan_load(ptr) (*(ptr))
# define tsan_store(ptr, val) (*(ptr) = (val)) # define tsan_store(ptr, val) (*(ptr) = (val))
# define tsan_counter(ptr) ((*(ptr))++) # define tsan_add(ptr, n) (*(ptr) += (n))
# define tsan_decr(ptr) ((*(ptr))--)
/* /*
* Lack of tsan_ld_acq and tsan_ld_rel means that compiler support is not * Lack of tsan_ld_acq and tsan_ld_rel means that compiler support is not
* sophisticated enough to support them. Code that relies on them should be * sophisticated enough to support them. Code that relies on them should be
@ -142,3 +136,7 @@
*/ */
#endif #endif
#define tsan_counter(ptr) tsan_add((ptr), 1)
#define tsan_decr(ptr) tsan_add((ptr), -1)