18 of_atomic_int_add(
volatile int *_Nonnull p,
int i)
20 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
23 static OF_INLINE int32_t
24 of_atomic_int32_add(
volatile int32_t *_Nonnull p, int32_t i)
26 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
29 static OF_INLINE
void *_Nullable
30 of_atomic_ptr_add(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
32 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
36 of_atomic_int_sub(
volatile int *_Nonnull p,
int i)
38 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
41 static OF_INLINE int32_t
42 of_atomic_int32_sub(
volatile int32_t *_Nonnull p, int32_t i)
44 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
47 static OF_INLINE
void *_Nullable
48 of_atomic_ptr_sub(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
50 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
54 of_atomic_int_inc(
volatile int *_Nonnull p)
56 return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED);
59 static OF_INLINE int32_t
60 of_atomic_int32_inc(
volatile int32_t *_Nonnull p)
62 return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED);
66 of_atomic_int_dec(
volatile int *_Nonnull p)
68 return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED);
71 static OF_INLINE int32_t
72 of_atomic_int32_dec(
volatile int32_t *_Nonnull p)
74 return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED);
77 static OF_INLINE
unsigned int 78 of_atomic_int_or(
volatile unsigned int *_Nonnull p,
unsigned int i)
80 return __atomic_or_fetch(p, i, __ATOMIC_RELAXED);
83 static OF_INLINE uint32_t
84 of_atomic_int32_or(
volatile uint32_t *_Nonnull p, uint32_t i)
86 return __atomic_or_fetch(p, i, __ATOMIC_RELAXED);
89 static OF_INLINE
unsigned int 90 of_atomic_int_and(
volatile unsigned int *_Nonnull p,
unsigned int i)
92 return __atomic_and_fetch(p, i, __ATOMIC_RELAXED);
95 static OF_INLINE uint32_t
96 of_atomic_int32_and(
volatile uint32_t *_Nonnull p, uint32_t i)
98 return __atomic_and_fetch(p, i, __ATOMIC_RELAXED);
101 static OF_INLINE
unsigned int 102 of_atomic_int_xor(
volatile unsigned int *_Nonnull p,
unsigned int i)
104 return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED);
107 static OF_INLINE uint32_t
108 of_atomic_int32_xor(
volatile uint32_t *_Nonnull p, uint32_t i)
110 return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED);
113 static OF_INLINE
bool 114 of_atomic_int_cmpswap(
volatile int *_Nonnull p,
int o,
int n)
116 return __atomic_compare_exchange(p, &o, &n,
false,
117 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
120 static OF_INLINE
bool 121 of_atomic_int32_cmpswap(
volatile int32_t *_Nonnull p, int32_t o, int32_t n)
123 return __atomic_compare_exchange(p, &o, &n,
false,
124 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
127 static OF_INLINE
bool 128 of_atomic_ptr_cmpswap(
void *
volatile _Nullable *_Nonnull p,
129 void *_Nullable o,
void *_Nullable n)
131 return __atomic_compare_exchange(p, &o, &n,
false,
132 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
135 static OF_INLINE
void 136 of_memory_barrier_full(
void)
138 __atomic_thread_fence(__ATOMIC_SEQ_CST);
141 static OF_INLINE
void 142 of_memory_barrier_acquire(
void)
144 __atomic_thread_fence(__ATOMIC_ACQUIRE);
147 static OF_INLINE
void 148 of_memory_barrier_release(
void)
150 __atomic_thread_fence(__ATOMIC_RELEASE);