11 #ifndef __SYS_AtomicInt__
12 #define __SYS_AtomicInt__
63 {
return *
static_cast<const volatile T *
>(&myValue); }
79 explicit operator T()
const;
85 #if defined(AMD64) || defined(ARM64)
105 template <
typename T>
112 template <
typename T>
121 if (me == compare_swap(me, val))
131 template <
typename T>
140 if (me == compare_swap(me, val))
150 template <
typename T>
163 template <
typename T>
167 SYS_AtomicImpl::store(&myValue, val, order);
170 template <
typename T>
174 return SYS_AtomicImpl::load(&myValue, order);
GLuint GLdouble GLdouble GLint GLint order
T compare_and_swap(volatile T *addr, T oldval, T newval)
T test_and_set(T *addr, T val)
SYS_AtomicInt< int32 > SYS_AtomicInt32
void store(T val, SYS_MemoryOrder order=SYS_MEMORY_ORDER_SEQ_CST)
SYS_AtomicInt(SYS_EmptyConstructor)
void maximum(T val)
Atomically set myValue to the maximum of val and myValue.
T load(SYS_MemoryOrder order=SYS_MEMORY_ORDER_SEQ_CST) const
#define SYS_ATOMIC_INLINE
T compare_swap(T expected, T desired)
SYS_AtomicInt< int64 > SYS_AtomicInt64
T test_and_add(T *addr, T val)
Any reordering the compiler or hardware chooses to do is okay.
SYS_AtomicInt< int32 > SYS_AtomicCounter
T add(T val)
Atomically adds val to myValue, returning the new value of myValue.
SYS_FORCE_INLINE void relaxedStore(T val)
void minimum(T val)
Atomically set myValue to the minimum of val and myValue.
SYS_FORCE_INLINE T relaxedLoad() const