39#pragma GCC visibility push(default)
43#include <event_machine/platform/env/env_conf.h>
44#include <event_machine/platform/env/env_macros.h>
57} ENV_ALIGNED(
sizeof(uint32_t));
61} ENV_ALIGNED(
sizeof(uint64_t));
63typedef struct _env_atomic32 env_atomic32_t;
64typedef struct _env_atomic64 env_atomic64_t;
70env_atomic32_init(env_atomic32_t *atom)
72 __atomic_store_n(&atom->a32, 0, __ATOMIC_SEQ_CST);
76env_atomic32_set(env_atomic32_t *atom, uint32_t new_val)
78 __atomic_store_n(&atom->a32, new_val, __ATOMIC_SEQ_CST);
82env_atomic32_get(
const env_atomic32_t *atom)
84 return __atomic_load_n(&atom->a32, __ATOMIC_SEQ_CST);
88env_atomic32_dec(env_atomic32_t *atom)
90 (void)__atomic_fetch_sub(&atom->a32, 1, __ATOMIC_SEQ_CST);
94env_atomic32_inc(env_atomic32_t *atom)
96 (void)__atomic_fetch_add(&atom->a32, 1, __ATOMIC_SEQ_CST);
100env_atomic32_add(env_atomic32_t *atom, uint32_t add_val)
102 (void)__atomic_fetch_add(&atom->a32, add_val, __ATOMIC_SEQ_CST);
106env_atomic32_sub(env_atomic32_t *atom, uint32_t sub_val)
108 (void)__atomic_fetch_sub(&atom->a32, sub_val, __ATOMIC_SEQ_CST);
111static inline uint32_t
112env_atomic32_add_return(env_atomic32_t *atom, uint32_t add_val)
114 return __atomic_add_fetch(&atom->a32, add_val, __ATOMIC_SEQ_CST);
117static inline uint32_t
118env_atomic32_return_add(env_atomic32_t *atom, uint32_t add_val)
120 return __atomic_fetch_add(&atom->a32, add_val, __ATOMIC_SEQ_CST);
123static inline uint32_t
124env_atomic32_sub_return(env_atomic32_t *atom, uint32_t sub_val)
126 return __atomic_sub_fetch(&atom->a32, sub_val, __ATOMIC_SEQ_CST);
129static inline uint32_t
130env_atomic32_return_sub(env_atomic32_t *atom, uint32_t sub_val)
132 return __atomic_fetch_sub(&atom->a32, sub_val, __ATOMIC_SEQ_CST);
136env_atomic32_cmpset(env_atomic32_t *atom, uint32_t expected, uint32_t desired)
138 return __atomic_compare_exchange_n(&atom->a32, &expected, desired,
139 0 , __ATOMIC_SEQ_CST,
143static inline uint32_t
144env_atomic32_exchange(env_atomic32_t *atom, uint32_t new_val)
146 return __atomic_exchange_n(&atom->a32, new_val, __ATOMIC_SEQ_CST);
150env_atomic32_set_bits(env_atomic32_t *atom, uint32_t bit_mask)
157 old_val = env_atomic32_get(atom);
158 new_val = old_val | bit_mask;
159 ret = env_atomic32_cmpset(atom, old_val, new_val);
164env_atomic32_clr_bits(env_atomic32_t *atom, uint32_t bit_mask)
171 old_val = env_atomic32_get(atom);
172 new_val = old_val & (~bit_mask);
173 ret = env_atomic32_cmpset(atom, old_val, new_val);
178env_atomic32_cnt_bits(
const env_atomic32_t *atom)
180 return __builtin_popcount(env_atomic32_get(atom));
187env_atomic64_init(env_atomic64_t *atom)
189 __atomic_store_n(&atom->a64, 0, __ATOMIC_SEQ_CST);
193env_atomic64_set(env_atomic64_t *atom, uint64_t new_val)
195 __atomic_store_n(&atom->a64, new_val, __ATOMIC_SEQ_CST);
198static inline uint64_t
199env_atomic64_get(
const env_atomic64_t *atom)
201 return __atomic_load_n(&atom->a64, __ATOMIC_SEQ_CST);
205env_atomic64_dec(env_atomic64_t *atom)
207 (void)__atomic_fetch_sub(&atom->a64, 1, __ATOMIC_SEQ_CST);
211env_atomic64_inc(env_atomic64_t *atom)
213 (void)__atomic_fetch_add(&atom->a64, 1, __ATOMIC_SEQ_CST);
217env_atomic64_add(env_atomic64_t *atom, uint64_t add_val)
219 (void)__atomic_fetch_add(&atom->a64, add_val, __ATOMIC_SEQ_CST);
223env_atomic64_sub(env_atomic64_t *atom, uint64_t sub_val)
225 (void)__atomic_fetch_sub(&atom->a64, sub_val, __ATOMIC_SEQ_CST);
228static inline uint64_t
229env_atomic64_add_return(env_atomic64_t *atom, uint64_t add_val)
231 return __atomic_add_fetch(&atom->a64, add_val, __ATOMIC_SEQ_CST);
234static inline uint64_t
235env_atomic64_return_add(env_atomic64_t *atom, uint64_t add_val)
237 return __atomic_fetch_add(&atom->a64, add_val, __ATOMIC_SEQ_CST);
240static inline uint64_t
241env_atomic64_sub_return(env_atomic64_t *atom, uint64_t sub_val)
243 return __atomic_sub_fetch(&atom->a64, sub_val, __ATOMIC_SEQ_CST);
246static inline uint64_t
247env_atomic64_return_sub(env_atomic64_t *atom, uint64_t sub_val)
249 return __atomic_fetch_sub(&atom->a64, sub_val, __ATOMIC_SEQ_CST);
253env_atomic64_cmpset(env_atomic64_t *atom, uint64_t expected, uint64_t desired)
255 return __atomic_compare_exchange_n(&atom->a64, &expected, desired,
256 0 , __ATOMIC_SEQ_CST,
260static inline uint64_t
261env_atomic64_exchange(env_atomic64_t *atom, uint64_t new_val)
263 return __atomic_exchange_n(&atom->a64, new_val, __ATOMIC_SEQ_CST);
267env_atomic64_set_bits(env_atomic64_t *atom, uint64_t bit_mask)
274 old_val = env_atomic64_get(atom);
275 new_val = old_val | bit_mask;
276 ret = env_atomic64_cmpset(atom, old_val, new_val);
281env_atomic64_clr_bits(env_atomic64_t *atom, uint64_t bit_mask)
288 old_val = env_atomic64_get(atom);
289 new_val = old_val & (~bit_mask);
290 ret = env_atomic64_cmpset(atom, old_val, new_val);
295env_atomic64_cnt_bits(
const env_atomic64_t *atom)
297 return __builtin_popcountll(env_atomic64_get(atom));
305#pragma GCC visibility pop