1010#define LLVM_LIBC_SRC___SUPPORT_TAGGED_POINTER_H
1111
1212#include " hdr/types/size_t.h"
13+ #include " src/__support/CPP/atomic.h"
1314#include " src/__support/common.h"
1415#include " src/__support/threads/sleep.h"
1516
@@ -40,24 +41,28 @@ template <class T, bool IsAtomic> struct AbaPtrImpl {
4041 template <class Op > LIBC_INLINE void transaction (Op &&op) {
4142 if constexpr (IsAtomic) {
4243 for (;;) {
44+ cpp::AtomicRef<typename Impl::Atomic> ref (impl.atomic );
4345 typename Impl::Atomic snapshot, next;
44- __atomic_load (&impl. atomic , & snapshot, __ATOMIC_RELAXED );
46+ snapshot = ref. load (cpp::MemoryOrder::RELAXED );
4547 next.ptr = op (snapshot.ptr );
4648 // Wrapping add for unsigned integers.
4749 next.tag = snapshot.tag + 1 ;
48- if (__atomic_compare_exchange (&impl.atomic , &snapshot, &next, true ,
49- __ATOMIC_ACQ_REL, __ATOMIC_RELAXED))
50+ // Redo transaction can be costly, so we use strong version.
51+ if (ref.compare_exchange_strong (snapshot, next,
52+ cpp::MemoryOrder::ACQ_REL,
53+ cpp::MemoryOrder::RELAXED))
5054 return ;
5155 }
5256 } else {
5357 // Acquire the lock.
54- while (__atomic_exchange_n (&impl.mutex .locked , true , __ATOMIC_ACQUIRE))
55- while (__atomic_load_n (&impl.mutex .locked , __ATOMIC_RELAXED))
58+ cpp::AtomicRef<bool > ref (impl.mutex .locked );
59+ while (ref.exchange (true , cpp::MemoryOrder::ACQUIRE))
60+ while (ref.load (cpp::MemoryOrder::RELAXED))
5661 LIBC_NAMESPACE::sleep_briefly ();
5762
5863 impl.mutex .ptr = op (impl.mutex .ptr );
5964 // Release the lock.
60- __atomic_store_n (&impl. mutex . locked , false , __ATOMIC_RELEASE );
65+ ref. store ( false , cpp::MemoryOrder::RELEASE );
6166 }
6267 }
6368
@@ -68,7 +73,8 @@ template <class T, bool IsAtomic> struct AbaPtrImpl {
6873 // implementations that uses racy read anyway, we still load the whole
6974 // word to avoid any complications.
7075 typename Impl::Atomic snapshot;
71- __atomic_load (&impl.atomic , &snapshot, __ATOMIC_RELAXED);
76+ cpp::AtomicRef<typename Impl::Atomic> ref (impl.atomic );
77+ snapshot = ref.load (cpp::MemoryOrder::RELAXED);
7278 return snapshot.ptr ;
7379 } else {
7480 return impl.mutex .ptr ;
0 commit comments