1 /* This file is derived from clang's stdatomic.h */
3 /*===---- stdatomic.h - Standard header for atomic types and operations -----===
5 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6 * See https://llvm.org/LICENSE.txt for license information.
7 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
9 *===-----------------------------------------------------------------------===
18 #define __ATOMIC_RELAXED 0
19 #define __ATOMIC_CONSUME 1
20 #define __ATOMIC_ACQUIRE 2
21 #define __ATOMIC_RELEASE 3
22 #define __ATOMIC_ACQ_REL 4
23 #define __ATOMIC_SEQ_CST 5
27 memory_order_relaxed
= __ATOMIC_RELAXED
,
28 memory_order_consume
= __ATOMIC_CONSUME
,
29 memory_order_acquire
= __ATOMIC_ACQUIRE
,
30 memory_order_release
= __ATOMIC_RELEASE
,
31 memory_order_acq_rel
= __ATOMIC_ACQ_REL
,
32 memory_order_seq_cst
= __ATOMIC_SEQ_CST
,
36 typedef _Atomic(_Bool
) atomic_bool
;
37 typedef _Atomic(char) atomic_char
;
38 typedef _Atomic(signed char) atomic_schar
;
39 typedef _Atomic(unsigned char) atomic_uchar
;
40 typedef _Atomic(short) atomic_short
;
41 typedef _Atomic(unsigned short) atomic_ushort
;
42 typedef _Atomic(int) atomic_int
;
43 typedef _Atomic(unsigned int) atomic_uint
;
44 typedef _Atomic(long) atomic_long
;
45 typedef _Atomic(unsigned long) atomic_ulong
;
46 typedef _Atomic(long long) atomic_llong
;
47 typedef _Atomic(unsigned long long) atomic_ullong
;
48 typedef _Atomic(uint_least16_t) atomic_char16_t
;
49 typedef _Atomic(uint_least32_t) atomic_char32_t
;
50 typedef _Atomic(wchar_t) atomic_wchar_t
;
51 typedef _Atomic(int_least8_t) atomic_int_least8_t
;
52 typedef _Atomic(uint_least8_t) atomic_uint_least8_t
;
53 typedef _Atomic(int_least16_t) atomic_int_least16_t
;
54 typedef _Atomic(uint_least16_t) atomic_uint_least16_t
;
55 typedef _Atomic(int_least32_t) atomic_int_least32_t
;
56 typedef _Atomic(uint_least32_t) atomic_uint_least32_t
;
57 typedef _Atomic(int_least64_t) atomic_int_least64_t
;
58 typedef _Atomic(uint_least64_t) atomic_uint_least64_t
;
59 typedef _Atomic(int_fast8_t) atomic_int_fast8_t
;
60 typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t
;
61 typedef _Atomic(int_fast16_t) atomic_int_fast16_t
;
62 typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t
;
63 typedef _Atomic(int_fast32_t) atomic_int_fast32_t
;
64 typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t
;
65 typedef _Atomic(int_fast64_t) atomic_int_fast64_t
;
66 typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t
;
67 typedef _Atomic(intptr_t) atomic_intptr_t
;
68 typedef _Atomic(uintptr_t) atomic_uintptr_t
;
69 typedef _Atomic(size_t) atomic_size_t
;
70 typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t
;
71 typedef _Atomic(intmax_t) atomic_intmax_t
;
72 typedef _Atomic(uintmax_t) atomic_uintmax_t
;
79 #define ATOMIC_FLAG_INIT {0}
81 #define atomic_flag_test_and_set(object) \
82 __atomic_exchange(&(object)->value, 1, __ATOMIC_SEQ_CST)
83 #define atomic_flag_test_and_set_explicit(object, order) \
84 __atomic_exchange(&(object)->value, 1, order)
86 #define atomic_flag_clear(object) \
87 __atomic_store(&(object)->value, 0, __ATOMIC_SEQ_CST)
88 #define atomic_flag_clear_explicit(object, order) \
89 __atomic_store(&(object)->value, 0, order)
91 /* Generic routines */
92 #define atomic_init(object, desired) \
93 __atomic_store(object, desired, __ATOMIC_RELAXED)
95 #define atomic_store(object, desired) \
96 __atomic_store(object, desired, __ATOMIC_SEQ_CST)
97 #define atomic_store_explicit __atomic_store
99 #define atomic_load(object) \
100 __atomic_load(object, __ATOMIC_SEQ_CST)
101 #define atomic_load_explicit __atomic_load
103 #define atomic_exchange(object, desired) \
104 __atomic_exchange(object, desired, __ATOMIC_SEQ_CST)
105 #define atomic_exchange_explicit __atomic_exchange
107 #define atomic_compare_exchange_strong(object, expected, desired) \
108 __atomic_compare_exchange(object, expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
109 #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \
110 __atomic_compare_exchange(object, expected, desired, 0, success, failure)
112 #define atomic_compare_exchange_weak(object, expected, desired) \
113 __atomic_compare_exchange(object, expected, desired, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)
114 #define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \
115 __atomic_compare_exchange(object, expected, desired, 1, success, failure)
117 #define atomic_fetch_add(object, operand) \
118 __atomic_fetch_add(object, operand, __ATOMIC_SEQ_CST)
119 #define atomic_fetch_add_explicit __atomic_fetch_add
121 #define atomic_fetch_sub(object, operand) \
122 __atomic_fetch_sub(object, operand, __ATOMIC_SEQ_CST)
123 #define atomic_fetch_sub_explicit __atomic_fetch_sub
125 #define atomic_fetch_or(object, operand) \
126 __atomic_fetch_or(object, operand, __ATOMIC_SEQ_CST)
127 #define atomic_fetch_or_explicit __atomic_fetch_or
129 #define atomic_fetch_xor(object, operand) \
130 __atomic_fetch_xor(object, operand, __ATOMIC_SEQ_CST)
131 #define atomic_fetch_xor_explicit __atomic_fetch_xor
133 #define atomic_fetch_and(object, operand) \
134 __atomic_fetch_and(object, operand, __ATOMIC_SEQ_CST)
135 #define atomic_fetch_and_explicit __atomic_fetch_and
137 #endif /* _STDATOMIC_H */