4#ifdef __STDC_NO_ATOMICS__
5#error No standard atomic header available, are you compiling using C11 at least ?
8#include <kernel/types.h>
10#include <utils/compiler.h>
14#define __atomic_t native_t
23 _Atomic __atomic_t val;
26static_assert(
sizeof(
atomic_t) ==
sizeof(__atomic_t));
27static_assert(offsetof(
atomic_t, val) == 0);
30#define atomic_cast(val) \
32 _Static_assert(same_size(atomic_t, *val), "Invalid atomic cast"); \
37#define const_atomic_cast(val) \
39 _Static_assert(same_size(atomic_t, *val), "Invalid const atomic " \
41 (const atomic_t *)(val); \
45#define READ_ONCE(_x) \
47 _Static_assert(is_native_word(_x), "Variable is not of native size"); \
48 *(const volatile typeof(_x) *)&(_x); \
52#define WRITE_ONCE(_x, _val) \
54 _Static_assert(is_native_word(_x), "Variable is not of native size"); \
55 *(volatile typeof(_x) *)&(_x) = (_val); \
58#define stdatomic_read atomic_load
59#define stdatomic_write atomic_store
60#define stdatomic_add atomic_fetch_add
61#define stdatomic_sub atomic_fetch_sub
69#define stdatomic_exchange(atomic, val) \
70 atomic_exchange_explicit(atomic, val, memory_order_seq_cst);
73static ALWAYS_INLINE __atomic_t atomic_read(
const atomic_t *atomic)
75 return stdatomic_read(&atomic->val);
79static ALWAYS_INLINE
void atomic_write(
atomic_t *atomic, __atomic_t val)
81 stdatomic_write(&atomic->val, val);
85static ALWAYS_INLINE __atomic_t atomic_exchange(
atomic_t *atomic,
88 return stdatomic_exchange(&atomic->val, val);
95static ALWAYS_INLINE __atomic_t atomic_add(
atomic_t *atomic, __atomic_t val)
97 return stdatomic_add(&atomic->val, val);
104static ALWAYS_INLINE __atomic_t atomic_sub(
atomic_t *atomic, __atomic_t val)
106 return stdatomic_sub(&atomic->val, val);
113static ALWAYS_INLINE __atomic_t atomic_inc(
atomic_t *atomic)
115 return atomic_add(atomic, 1);
122static ALWAYS_INLINE __atomic_t atomic_dec(
atomic_t *atomic)
124 return atomic_sub(atomic, 1);
An atomic value.
Definition: atomic.h:22