Home | History | Annotate | Download | only in linux

Lines Matching defs:atomic

1 /*	$NetBSD: atomic.h,v 1.42 2021/12/19 12:21:30 riastradh Exp $	*/
35 #include <sys/atomic.h>
51 * atomic (u)int operations
58 struct atomic {
67 typedef struct atomic atomic_t;
70 atomic_read(const atomic_t *atomic)
73 return atomic->a_u.au_int;
77 atomic_set(atomic_t *atomic, int value)
80 atomic->a_u.au_int = value;
84 atomic_set_release(atomic_t *atomic, int value)
86 atomic_store_release(&atomic->a_u.au_int, value);
90 atomic_add(int addend, atomic_t *atomic)
93 atomic_add_int(&atomic->a_u.au_uint, addend);
97 atomic_sub(int subtrahend, atomic_t *atomic)
100 atomic_add_int(&atomic->a_u.au_uint, -subtrahend);
104 atomic_add_return(int addend, atomic_t *atomic)
109 v = (int)atomic_add_int_nv(&atomic->a_u.au_uint, addend);
116 atomic_sub_return(int subtrahend, atomic_t *atomic)
121 v = (int)atomic_add_int_nv(&atomic->a_u.au_uint, -subtrahend);
128 atomic_inc(atomic_t *atomic)
131 atomic_inc_uint(&atomic->a_u.au_uint);
135 atomic_dec(atomic_t *atomic)
138 atomic_dec_uint(&atomic->a_u.au_uint);
142 atomic_inc_return(atomic_t *atomic)
147 v = (int)atomic_inc_uint_nv(&atomic->a_u.au_uint);
154 atomic_dec_return(atomic_t *atomic)
159 v = (int)atomic_dec_uint_nv(&atomic->a_u.au_uint);
166 atomic_dec_and_test(atomic_t *atomic)
169 return atomic_dec_return(atomic) == 0;
173 atomic_dec_if_positive(atomic_t *atomic)
179 v = atomic->a_u.au_uint;
182 } while (atomic_cas_uint(&atomic->a_u.au_uint, v, v - 1) != v);
189 atomic_or(int value, atomic_t *atomic)
192 atomic_or_uint(&atomic->a_u.au_uint, value);
196 atomic_and(int value, atomic_t *atomic)
199 atomic_and_uint(&atomic->a_u.au_uint, value);
203 atomic_andnot(int value, atomic_t *atomic)
206 atomic_and_uint(&atomic->a_u.au_uint, ~value);
210 atomic_fetch_add(int value, atomic_t *atomic)
216 old = atomic->a_u.au_uint;
218 } while (atomic_cas_uint(&atomic->a_u.au_uint, old, new) != old);
225 atomic_fetch_inc(atomic_t *atomic)
227 return atomic_fetch_add(1, atomic);
231 atomic_fetch_xor(int value, atomic_t *atomic)
237 old = atomic->a_u.au_uint;
239 } while (atomic_cas_uint(&atomic->a_u.au_uint, old, new) != old);
246 atomic_set_mask(unsigned long mask, atomic_t *atomic)
249 atomic_or_uint(&atomic->a_u.au_uint, mask);
253 atomic_clear_mask(unsigned long mask, atomic_t *atomic)
256 atomic_and_uint(&atomic->a_u.au_uint, ~mask);
260 atomic_add_unless(atomic_t *atomic, int addend, int zero)
266 value = atomic->a_u.au_int;
269 } while (atomic_cas_uint(&atomic->a_u.au_uint, value, (value + addend))
277 atomic_inc_not_zero(atomic_t *atomic)
280 return atomic_add_unless(atomic, 1, 0);
284 atomic_xchg(atomic_t *atomic, int new)
289 old = (int)atomic_swap_uint(&atomic->a_u.au_uint, (unsigned)new);
296 atomic_cmpxchg(atomic_t *atomic, int expect, int new)
306 old = (int)atomic_cas_uint(&atomic->a_u.au_uint, (unsigned)expect,
314 atomic_try_cmpxchg(atomic_t *atomic, int *valuep, int new)
318 *valuep = atomic_cmpxchg(atomic, expect, new);
389 atomic64_cmpxchg(struct atomic64 *atomic, uint64_t expect, uint64_t new)
399 old = atomic_cas_64(&atomic->a_v, expect, new);