Skip to content

Commit

Permalink
Re-add some atomic operations, still not compiling exchange okay.
Browse files Browse the repository at this point in the history
  • Loading branch information
rgal committed Jan 28, 2021
1 parent 28d86c2 commit 67b1bc2
Showing 1 changed file with 39 additions and 15 deletions.
54 changes: 39 additions & 15 deletions compiler-rt/lib/scudo/standalone/atomic_helpers.h
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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.

Expand Down

0 comments on commit 67b1bc2

Please sign in to comment.