16 #include <libkern/OSAtomic.h>
19 of_atomic_int_add(
volatile int *_Nonnull p,
int i)
21 return OSAtomicAdd32(i, p);
24 static OF_INLINE int32_t
25 of_atomic_int32_add(
volatile int32_t *_Nonnull p, int32_t i)
27 return OSAtomicAdd32(i, p);
30 static OF_INLINE
void *_Nullable
31 of_atomic_ptr_add(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
34 return (
void *)OSAtomicAdd64(i, (int64_t *)p);
36 return (
void *)OSAtomicAdd32(i, (int32_t *)p);
41 of_atomic_int_sub(
volatile int *_Nonnull p,
int i)
43 return OSAtomicAdd32(-i, p);
46 static OF_INLINE int32_t
47 of_atomic_int32_sub(
volatile int32_t *_Nonnull p, int32_t i)
49 return OSAtomicAdd32(-i, p);
52 static OF_INLINE
void *_Nullable
53 of_atomic_ptr_sub(
void *
volatile _Nullable *_Nonnull p, intptr_t i)
56 return (
void *)OSAtomicAdd64(-i, (int64_t *)p);
58 return (
void *)OSAtomicAdd32(-i, (int32_t *)p);
63 of_atomic_int_inc(
volatile int *_Nonnull p)
65 return OSAtomicIncrement32(p);
68 static OF_INLINE int32_t
69 of_atomic_int32_inc(
volatile int32_t *_Nonnull p)
71 return OSAtomicIncrement32(p);
75 of_atomic_int_dec(
volatile int *_Nonnull p)
77 return OSAtomicDecrement32(p);
80 static OF_INLINE int32_t
81 of_atomic_int32_dec(
volatile int32_t *_Nonnull p)
83 return OSAtomicDecrement32(p);
86 static OF_INLINE
unsigned int
87 of_atomic_int_or(
volatile unsigned int *_Nonnull p,
unsigned int i)
89 return OSAtomicOr32(i, p);
92 static OF_INLINE uint32_t
93 of_atomic_int32_or(
volatile uint32_t *_Nonnull p, uint32_t i)
95 return OSAtomicOr32(i, p);
98 static OF_INLINE
unsigned int
99 of_atomic_int_and(
volatile unsigned int *_Nonnull p,
unsigned int i)
101 return OSAtomicAnd32(i, p);
104 static OF_INLINE uint32_t
105 of_atomic_int32_and(
volatile uint32_t *_Nonnull p, uint32_t i)
107 return OSAtomicAnd32(i, p);
110 static OF_INLINE
unsigned int
111 of_atomic_int_xor(
volatile unsigned int *_Nonnull p,
unsigned int i)
113 return OSAtomicXor32(i, p);
116 static OF_INLINE uint32_t
117 of_atomic_int32_xor(
volatile uint32_t *_Nonnull p, uint32_t i)
119 return OSAtomicXor32(i, p);
122 static OF_INLINE
bool
123 of_atomic_int_cmpswap(
volatile int *_Nonnull p,
int o,
int n)
125 return OSAtomicCompareAndSwapInt(o, n, p);
128 static OF_INLINE
bool
129 of_atomic_int32_cmpswap(
volatile int32_t *_Nonnull p, int32_t o, int32_t n)
131 return OSAtomicCompareAndSwap32(o, n, p);
134 static OF_INLINE
bool
135 of_atomic_ptr_cmpswap(
void *
volatile _Nullable *_Nonnull p,
136 void *_Nullable o,
void *_Nullable n)
138 return OSAtomicCompareAndSwapPtr(o, n, p);
141 static OF_INLINE
void
142 of_memory_barrier(
void)
147 static OF_INLINE
void
148 of_memory_barrier_acquire(
void)
153 static OF_INLINE
void
154 of_memory_barrier_release(
void)