diff options
author | Russell Gallop <russell.gallop@sony.com> | 2020-09-16 15:06:07 +0100 |
---|---|---|
committer | Russell Gallop <russell.gallop@sony.com> | 2021-01-28 12:19:56 +0000 |
commit | 67b1bc2628b4e8ef624324f622f1243d07df9255 (patch) | |
tree | d75118757fc4f86b1d047b98e55ed3d5ac0ea9f2 | |
parent | 28d86c2f9c9c77c2c686fc65e9eb5bcfa361e3d9 (diff) | |
download | llvm-67b1bc2628b4e8ef624324f622f1243d07df9255.tar.gz |
Re-add some atomic operations, still not compiling exchange okay.
-rw-r--r-- | compiler-rt/lib/scudo/standalone/atomic_helpers.h | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/compiler-rt/lib/scudo/standalone/atomic_helpers.h b/compiler-rt/lib/scudo/standalone/atomic_helpers.h index 25e856c7f996..e8bf59a4e57d 100644 --- a/compiler-rt/lib/scudo/standalone/atomic_helpers.h +++ b/compiler-rt/lib/scudo/standalone/atomic_helpers.h @@ -114,7 +114,31 @@ struct atomic_uptr { //} // //inline void atomic_thread_fence(memory_order) { __sync_synchronize(); } -// + + +INLINE u32 atomic_fetch_add(volatile atomic_u32 *a, u32 v, + memory_order mo) { + (void)mo; + DCHECK(!((uptr)a % sizeof(*a))); + return (u32)_InterlockedExchangeAdd((volatile long *)&a->ValDoNotUse, + (long)v); +} + +INLINE uptr atomic_fetch_add(volatile atomic_uptr *a, uptr v, + memory_order mo) { + (void)mo; + DCHECK(!((uptr)a % sizeof(*a))); +#ifdef _WIN64 + return (uptr)_InterlockedExchangeAdd64((volatile long long *)&a->ValDoNotUse, + (long long)v); +#else + return (uptr)_InterlockedExchangeAdd((volatile long *)&a->ValDoNotUse, + (long)v); +#endif +} + + + //template <typename T> //inline typename T::Type atomic_fetch_add(volatile T *A, typename T::Type V, // memory_order MO) { @@ -152,13 +176,13 @@ struct atomic_uptr { // return R; //} // -//template <typename T> -//inline bool atomic_compare_exchange_strong(volatile T *A, typename T::Type *Cmp, -// typename T::Type Xchg, -// memory_order MO) { -// return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, false, MO, -// __ATOMIC_RELAXED); -//} +template <typename T> +inline bool atomic_compare_exchange_strong(volatile T *A, typename T::Type *Cmp, + typename T::Type Xchg, + memory_order MO) { + return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, false, MO, + __ATOMIC_RELAXED); +} INLINE bool atomic_compare_exchange_strong(volatile atomic_u8 *a, u8 *cmp, u8 xchgv, memory_order mo) { @@ -234,13 +258,13 @@ INLINE bool atomic_compare_exchange_strong(volatile atomic_u64 *a, -//template <typename T> -//inline bool atomic_compare_exchange_weak(volatile T *A, typename T::Type *Cmp, -// typename T::Type Xchg, -// memory_order MO) { -// return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, true, MO, -// __ATOMIC_RELAXED); -//} +template <typename T> +inline bool atomic_compare_exchange_weak(volatile T *A, typename T::Type *Cmp, + typename T::Type Xchg, + memory_order MO) { + return __atomic_compare_exchange(&A->ValDoNotUse, Cmp, &Xchg, true, MO, + __ATOMIC_RELAXED); +} // Clutter-reducing helpers. |