17 of_atomic_int_add(
volatile int *_Nonnull p,
int i)
19 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
22 static OF_INLINE int32_t
23 of_atomic_int32_add(
volatile int32_t *_Nonnull p, int32_t i)
25 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
28 static OF_INLINE
void *_Nullable
29 of_atomic_ptr_add(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
31 return __atomic_add_fetch(p, i, __ATOMIC_RELAXED);
35 of_atomic_int_sub(
volatile int *_Nonnull p,
int i)
37 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
40 static OF_INLINE int32_t
41 of_atomic_int32_sub(
volatile int32_t *_Nonnull p, int32_t i)
43 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
46 static OF_INLINE
void *_Nullable
47 of_atomic_ptr_sub(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
49 return __atomic_sub_fetch(p, i, __ATOMIC_RELAXED);
53 of_atomic_int_inc(
volatile int *_Nonnull p)
55 return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED);
58 static OF_INLINE int32_t
59 of_atomic_int32_inc(
volatile int32_t *_Nonnull p)
61 return __atomic_add_fetch(p, 1, __ATOMIC_RELAXED);
65 of_atomic_int_dec(
volatile int *_Nonnull p)
67 return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED);
70 static OF_INLINE int32_t
71 of_atomic_int32_dec(
volatile int32_t *_Nonnull p)
73 return __atomic_sub_fetch(p, 1, __ATOMIC_RELAXED);
76 static OF_INLINE
unsigned int
77 of_atomic_int_or(
volatile unsigned int *_Nonnull p,
unsigned int i)
79 return __atomic_or_fetch(p, i, __ATOMIC_RELAXED);
82 static OF_INLINE uint32_t
83 of_atomic_int32_or(
volatile uint32_t *_Nonnull p, uint32_t i)
85 return __atomic_or_fetch(p, i, __ATOMIC_RELAXED);
88 static OF_INLINE
unsigned int
89 of_atomic_int_and(
volatile unsigned int *_Nonnull p,
unsigned int i)
91 return __atomic_and_fetch(p, i, __ATOMIC_RELAXED);
94 static OF_INLINE uint32_t
95 of_atomic_int32_and(
volatile uint32_t *_Nonnull p, uint32_t i)
97 return __atomic_and_fetch(p, i, __ATOMIC_RELAXED);
100 static OF_INLINE
unsigned int
101 of_atomic_int_xor(
volatile unsigned int *_Nonnull p,
unsigned int i)
103 return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED);
106 static OF_INLINE uint32_t
107 of_atomic_int32_xor(
volatile uint32_t *_Nonnull p, uint32_t i)
109 return __atomic_xor_fetch(p, i, __ATOMIC_RELAXED);
112 static OF_INLINE
bool
113 of_atomic_int_cmpswap(
volatile int *_Nonnull p,
int o,
int n)
115 return __atomic_compare_exchange(p, &o, &n,
false,
116 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
119 static OF_INLINE
bool
120 of_atomic_int32_cmpswap(
volatile int32_t *_Nonnull p, int32_t o, int32_t n)
122 return __atomic_compare_exchange(p, &o, &n,
false,
123 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
126 static OF_INLINE
bool
127 of_atomic_ptr_cmpswap(
void *
volatile _Nullable *_Nonnull p,
128 void *_Nullable o,
void *_Nullable n)
130 return __atomic_compare_exchange(p, &o, &n,
false,
131 __ATOMIC_RELAXED, __ATOMIC_RELAXED);
134 static OF_INLINE
void
135 of_memory_barrier_full(
void)
137 __atomic_thread_fence(__ATOMIC_SEQ_CST);
140 static OF_INLINE
void
141 of_memory_barrier_acquire(
void)
143 __atomic_thread_fence(__ATOMIC_ACQUIRE);
146 static OF_INLINE
void
147 of_memory_barrier_release(
void)
149 __atomic_thread_fence(__ATOMIC_RELEASE);