1 // Copyright © Tavian Barnes <tavianator@tavianator.com>
2 // SPDX-License-Identifier: 0BSD
5 * Shorthand for standard C atomic operations.
11 #include <stdatomic.h>
14 * Prettier spelling of _Atomic.
16 #define atomic _Atomic
19 * Shorthand for atomic_load_explicit().
22 * A pointer to the atomic object.
24 * The memory ordering to use, without the memory_order_ prefix.
28 #define load(obj, order) \
29 atomic_load_explicit(obj, memory_order_##order)
32 * Shorthand for atomic_store_explicit().
34 #define store(obj, value, order) \
35 atomic_store_explicit(obj, value, memory_order_##order)
38 * Shorthand for atomic_exchange_explicit().
40 #define exchange(obj, value, order) \
41 atomic_exchange_explicit(obj, value, memory_order_##order)
44 * Shorthand for atomic_compare_exchange_weak_explicit().
46 #define compare_exchange_weak(obj, expected, desired, succ, fail) \
47 atomic_compare_exchange_weak_explicit(obj, expected, desired, memory_order_##succ, memory_order_##fail)
50 * Shorthand for atomic_compare_exchange_strong_explicit().
52 #define compare_exchange_strong(obj, expected, desired, succ, fail) \
53 atomic_compare_exchange_strong_explicit(obj, expected, desired, memory_order_##succ, memory_order_##fail)
56 * Shorthand for atomic_fetch_add_explicit().
58 #define fetch_add(obj, arg, order) \
59 atomic_fetch_add_explicit(obj, arg, memory_order_##order)
62 * Shorthand for atomic_fetch_sub_explicit().
64 #define fetch_sub(obj, arg, order) \
65 atomic_fetch_sub_explicit(obj, arg, memory_order_##order)
68 * Shorthand for atomic_fetch_or_explicit().
70 #define fetch_or(obj, arg, order) \
71 atomic_fetch_or_explicit(obj, arg, memory_order_##order)
74 * Shorthand for atomic_fetch_xor_explicit().
76 #define fetch_xor(obj, arg, order) \
77 atomic_fetch_xor_explicit(obj, arg, memory_order_##order)
80 * Shorthand for atomic_fetch_and_explicit().
82 #define fetch_and(obj, arg, order) \
83 atomic_fetch_and_explicit(obj, arg, memory_order_##order)
85 #endif // BFS_ATOMIC_H