1#ifndef __LINUX_ATOMIC_H__
2#define __LINUX_ATOMIC_H__
35#define ATOMIC_INIT(i) { (i) }
49#define ATOMIC64_INIT(i) { (i) }
51static inline long long atomic64_read(
const atomic64_t* v)
53 return __atomic_load_n(&v->
counter, __ATOMIC_SEQ_CST);
56static inline void atomic64_set(
atomic64_t* v,
long long i)
58 __atomic_store_n(&v->
counter, i, __ATOMIC_SEQ_CST);
63 __atomic_add_fetch(&v->
counter, 1LL, __ATOMIC_SEQ_CST);
67static inline void atomic64_add(
long long i,
atomic64_t* v)
69 (void)__atomic_fetch_add(&v->
counter, i, __ATOMIC_SEQ_CST);
79static inline long long atomic64_fetch_add(
long long i,
atomic64_t* v)
81 return __atomic_fetch_add(&v->
counter, i, __ATOMIC_SEQ_CST);
85static inline long long atomic64_inc_return(
atomic64_t* v)
87 return __atomic_add_fetch(&v->
counter, 1LL, __ATOMIC_SEQ_CST);
90static inline int atomic_read(
const atomic_t* v)
92 return __atomic_load_n(&v->
counter, __ATOMIC_SEQ_CST);
95static inline void atomic_set(
atomic_t* v,
int i)
97 __atomic_store_n(&v->
counter, i, __ATOMIC_SEQ_CST);
100static inline int atomic_add_return(
int i,
atomic_t* v)
102 return __atomic_add_fetch(&v->
counter, i, __ATOMIC_SEQ_CST);
105static inline int atomic_sub_return(
int i,
atomic_t* v)
107 return __atomic_sub_fetch(&v->
counter, i, __ATOMIC_SEQ_CST);
110static inline void atomic_add(
int i,
atomic_t* v)
112 (void)__atomic_fetch_add(&v->
counter, i, __ATOMIC_SEQ_CST);
115static inline void atomic_sub(
int i,
atomic_t* v)
117 (void)__atomic_fetch_sub(&v->
counter, i, __ATOMIC_SEQ_CST);
120static inline void atomic_inc(
atomic_t* v)
125static inline void atomic_dec(
atomic_t* v)
130static inline int atomic_inc_return(
atomic_t* v)
132 return atomic_add_return(1, v);
135static inline int atomic_dec_return(
atomic_t* v)
137 return atomic_sub_return(1, v);
141static inline bool atomic_dec_and_test(
atomic_t* v)
143 return atomic_dec_return(v) == 0;
147static inline int atomic_fetch_inc(
atomic_t* v)
149 return __atomic_fetch_add(&v->
counter, 1, __ATOMIC_SEQ_CST);
159static inline int atomic_read_acquire(
const atomic_t* v)
161 return __atomic_load_n(&v->
counter, __ATOMIC_ACQUIRE);
164static inline int atomic_xchg(
atomic_t* v,
int i)
166 return __atomic_exchange_n(&v->
counter, i, __ATOMIC_SEQ_CST);
169static inline int atomic_cmpxchg(
atomic_t* v,
int old,
int new_v)
172 (void)__atomic_compare_exchange_n(&v->
counter, &expected, new_v, 0,
173 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
178static inline int atomic_add_unless(
atomic_t* v,
int i,
int u)
180 int c = atomic_read(v);
185 }
while (!__atomic_compare_exchange_n(&v->
counter, &c, c + i, 0,
186 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST));
191static inline void atomic_or(
int i,
atomic_t* v)
193 (void)__atomic_fetch_or(&v->
counter, i, __ATOMIC_SEQ_CST);
196static inline void atomic_and(
int i,
atomic_t* v)
198 (void)__atomic_fetch_and(&v->
counter, i, __ATOMIC_SEQ_CST);
215#define ATOMIC_LONG_INIT(i) { (i) }
219 return __atomic_load_n(&v->
counter, __ATOMIC_SEQ_CST);
224 __atomic_store_n(&v->
counter, i, __ATOMIC_SEQ_CST);
229 (void)__atomic_fetch_add(&v->
counter, i, __ATOMIC_SEQ_CST);
232static inline long atomic_long_add_return(
long i,
atomic_long_t* v)
234 return __atomic_add_fetch(&v->
counter, i, __ATOMIC_SEQ_CST);
239 atomic_long_add(1, v);
244 atomic_long_add(-1, v);
249 return atomic_long_add_return(-1, v) == 0;
258static inline long atomic_long_inc_return_relaxed(
atomic_long_t* v)
260 return atomic_long_add_return(1, v);
263static inline long atomic_long_cmpxchg(
atomic_long_t* v,
long old,
long new_v)
266 (void)__atomic_compare_exchange_n(&v->
counter, &expected, new_v, 0,
267 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
290static inline bool atomic_long_try_cmpxchg(
atomic_long_t* v,
long* old,
293 return __atomic_compare_exchange_n(&v->
counter, old, new_v, 0,
294 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
321#define cmpxchg(ptr, old, new) \
323 typeof(*(ptr)) __old = (old); \
324 typeof(*(ptr)) __new = (new); \
325 (void)__atomic_compare_exchange_n((ptr), &__old, __new, 0, \
326 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
long long counter
Definition atomic.h:46
long counter
Definition atomic.h:212
int counter
Definition atomic.h:32