]> Sergey Matveev's repositories - bfs.git/blob - src/atomic.h
Skip mtab
[bfs.git] / src / atomic.h
1 // Copyright © Tavian Barnes <tavianator@tavianator.com>
2 // SPDX-License-Identifier: 0BSD
3
4 /**
5  * Shorthand for standard C atomic operations.
6  */
7
8 #ifndef BFS_ATOMIC_H
9 #define BFS_ATOMIC_H
10
11 #include <stdatomic.h>
12
13 /**
14  * Prettier spelling of _Atomic.
15  */
16 #define atomic _Atomic
17
18 /**
19  * Shorthand for atomic_load_explicit().
20  *
21  * @param obj
22  *         A pointer to the atomic object.
23  * @param order
24  *         The memory ordering to use, without the memory_order_ prefix.
25  * @return
26  *         The loaded value.
27  */
28 #define load(obj, order) \
29         atomic_load_explicit(obj, memory_order_##order)
30
31 /**
32  * Shorthand for atomic_store_explicit().
33  */
34 #define store(obj, value, order) \
35         atomic_store_explicit(obj, value, memory_order_##order)
36
37 /**
38  * Shorthand for atomic_exchange_explicit().
39  */
40 #define exchange(obj, value, order) \
41         atomic_exchange_explicit(obj, value, memory_order_##order)
42
43 /**
44  * Shorthand for atomic_compare_exchange_weak_explicit().
45  */
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)
48
49 /**
50  * Shorthand for atomic_compare_exchange_strong_explicit().
51  */
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)
54
55 /**
56  * Shorthand for atomic_fetch_add_explicit().
57  */
58 #define fetch_add(obj, arg, order) \
59         atomic_fetch_add_explicit(obj, arg, memory_order_##order)
60
61 /**
62  * Shorthand for atomic_fetch_sub_explicit().
63  */
64 #define fetch_sub(obj, arg, order) \
65         atomic_fetch_sub_explicit(obj, arg, memory_order_##order)
66
67 /**
68  * Shorthand for atomic_fetch_or_explicit().
69  */
70 #define fetch_or(obj, arg, order) \
71         atomic_fetch_or_explicit(obj, arg, memory_order_##order)
72
73 /**
74  * Shorthand for atomic_fetch_xor_explicit().
75  */
76 #define fetch_xor(obj, arg, order) \
77         atomic_fetch_xor_explicit(obj, arg, memory_order_##order)
78
79 /**
80  * Shorthand for atomic_fetch_and_explicit().
81  */
82 #define fetch_and(obj, arg, order) \
83         atomic_fetch_and_explicit(obj, arg, memory_order_##order)
84
85 #endif // BFS_ATOMIC_H