1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | #ifndef __CLANG_STDATOMIC_H |
25 | #define __CLANG_STDATOMIC_H |
26 | |
27 | |
28 | |
29 | |
30 | #if __STDC_HOSTED__ && __has_include_next(<stdatomic.h>) |
31 | # include_next <stdatomic.h> |
32 | #else |
33 | |
34 | #include <stddef.h> |
35 | #include <stdint.h> |
36 | |
37 | #ifdef __cplusplus |
38 | extern "C" { |
39 | #endif |
40 | |
41 | |
42 | |
43 | #define ATOMIC_BOOL_LOCK_FREE __CLANG_ATOMIC_BOOL_LOCK_FREE |
44 | #define ATOMIC_CHAR_LOCK_FREE __CLANG_ATOMIC_CHAR_LOCK_FREE |
45 | #define ATOMIC_CHAR16_T_LOCK_FREE __CLANG_ATOMIC_CHAR16_T_LOCK_FREE |
46 | #define ATOMIC_CHAR32_T_LOCK_FREE __CLANG_ATOMIC_CHAR32_T_LOCK_FREE |
47 | #define ATOMIC_WCHAR_T_LOCK_FREE __CLANG_ATOMIC_WCHAR_T_LOCK_FREE |
48 | #define ATOMIC_SHORT_LOCK_FREE __CLANG_ATOMIC_SHORT_LOCK_FREE |
49 | #define ATOMIC_INT_LOCK_FREE __CLANG_ATOMIC_INT_LOCK_FREE |
50 | #define ATOMIC_LONG_LOCK_FREE __CLANG_ATOMIC_LONG_LOCK_FREE |
51 | #define ATOMIC_LLONG_LOCK_FREE __CLANG_ATOMIC_LLONG_LOCK_FREE |
52 | #define ATOMIC_POINTER_LOCK_FREE __CLANG_ATOMIC_POINTER_LOCK_FREE |
53 | |
54 | |
55 | |
56 | #define ATOMIC_VAR_INIT(value) (value) |
57 | #define atomic_init __c11_atomic_init |
58 | |
59 | |
60 | |
61 | typedef enum memory_order { |
62 | memory_order_relaxed = __ATOMIC_RELAXED, |
63 | memory_order_consume = __ATOMIC_CONSUME, |
64 | memory_order_acquire = __ATOMIC_ACQUIRE, |
65 | memory_order_release = __ATOMIC_RELEASE, |
66 | memory_order_acq_rel = __ATOMIC_ACQ_REL, |
67 | memory_order_seq_cst = __ATOMIC_SEQ_CST |
68 | } memory_order; |
69 | |
70 | #define kill_dependency(y) (y) |
71 | |
72 | |
73 | |
74 | |
75 | void atomic_thread_fence(memory_order); |
76 | void atomic_signal_fence(memory_order); |
77 | |
78 | #define atomic_thread_fence(order) __c11_atomic_thread_fence(order) |
79 | #define atomic_signal_fence(order) __c11_atomic_signal_fence(order) |
80 | |
81 | |
82 | |
83 | #define atomic_is_lock_free(obj) __c11_atomic_is_lock_free(sizeof(*(obj))) |
84 | |
85 | |
86 | |
87 | #ifdef __cplusplus |
88 | typedef _Atomic(bool) atomic_bool; |
89 | #else |
90 | typedef _Atomic(_Bool) atomic_bool; |
91 | #endif |
92 | typedef _Atomic(char) atomic_char; |
93 | typedef _Atomic(signed char) atomic_schar; |
94 | typedef _Atomic(unsigned char) atomic_uchar; |
95 | typedef _Atomic(short) atomic_short; |
96 | typedef _Atomic(unsigned short) atomic_ushort; |
97 | typedef _Atomic(int) atomic_int; |
98 | typedef _Atomic(unsigned int) atomic_uint; |
99 | typedef _Atomic(long) atomic_long; |
100 | typedef _Atomic(unsigned long) atomic_ulong; |
101 | typedef _Atomic(long long) atomic_llong; |
102 | typedef _Atomic(unsigned long long) atomic_ullong; |
103 | typedef _Atomic(uint_least16_t) atomic_char16_t; |
104 | typedef _Atomic(uint_least32_t) atomic_char32_t; |
105 | typedef _Atomic(wchar_t) atomic_wchar_t; |
106 | typedef _Atomic(int_least8_t) atomic_int_least8_t; |
107 | typedef _Atomic(uint_least8_t) atomic_uint_least8_t; |
108 | typedef _Atomic(int_least16_t) atomic_int_least16_t; |
109 | typedef _Atomic(uint_least16_t) atomic_uint_least16_t; |
110 | typedef _Atomic(int_least32_t) atomic_int_least32_t; |
111 | typedef _Atomic(uint_least32_t) atomic_uint_least32_t; |
112 | typedef _Atomic(int_least64_t) atomic_int_least64_t; |
113 | typedef _Atomic(uint_least64_t) atomic_uint_least64_t; |
114 | typedef _Atomic(int_fast8_t) atomic_int_fast8_t; |
115 | typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t; |
116 | typedef _Atomic(int_fast16_t) atomic_int_fast16_t; |
117 | typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t; |
118 | typedef _Atomic(int_fast32_t) atomic_int_fast32_t; |
119 | typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t; |
120 | typedef _Atomic(int_fast64_t) atomic_int_fast64_t; |
121 | typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t; |
122 | typedef _Atomic(intptr_t) atomic_intptr_t; |
123 | typedef _Atomic(uintptr_t) atomic_uintptr_t; |
124 | typedef _Atomic(size_t) atomic_size_t; |
125 | typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t; |
126 | typedef _Atomic(intmax_t) atomic_intmax_t; |
127 | typedef _Atomic(uintmax_t) atomic_uintmax_t; |
128 | |
129 | |
130 | |
131 | #define atomic_store(object, desired) __c11_atomic_store(object, desired, __ATOMIC_SEQ_CST) |
132 | #define atomic_store_explicit __c11_atomic_store |
133 | |
134 | #define atomic_load(object) __c11_atomic_load(object, __ATOMIC_SEQ_CST) |
135 | #define atomic_load_explicit __c11_atomic_load |
136 | |
137 | #define atomic_exchange(object, desired) __c11_atomic_exchange(object, desired, __ATOMIC_SEQ_CST) |
138 | #define atomic_exchange_explicit __c11_atomic_exchange |
139 | |
140 | #define atomic_compare_exchange_strong(object, expected, desired) __c11_atomic_compare_exchange_strong(object, expected, desired, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) |
141 | #define atomic_compare_exchange_strong_explicit __c11_atomic_compare_exchange_strong |
142 | |
143 | #define atomic_compare_exchange_weak(object, expected, desired) __c11_atomic_compare_exchange_weak(object, expected, desired, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) |
144 | #define atomic_compare_exchange_weak_explicit __c11_atomic_compare_exchange_weak |
145 | |
146 | #define atomic_fetch_add(object, operand) __c11_atomic_fetch_add(object, operand, __ATOMIC_SEQ_CST) |
147 | #define atomic_fetch_add_explicit __c11_atomic_fetch_add |
148 | |
149 | #define atomic_fetch_sub(object, operand) __c11_atomic_fetch_sub(object, operand, __ATOMIC_SEQ_CST) |
150 | #define atomic_fetch_sub_explicit __c11_atomic_fetch_sub |
151 | |
152 | #define atomic_fetch_or(object, operand) __c11_atomic_fetch_or(object, operand, __ATOMIC_SEQ_CST) |
153 | #define atomic_fetch_or_explicit __c11_atomic_fetch_or |
154 | |
155 | #define atomic_fetch_xor(object, operand) __c11_atomic_fetch_xor(object, operand, __ATOMIC_SEQ_CST) |
156 | #define atomic_fetch_xor_explicit __c11_atomic_fetch_xor |
157 | |
158 | #define atomic_fetch_and(object, operand) __c11_atomic_fetch_and(object, operand, __ATOMIC_SEQ_CST) |
159 | #define atomic_fetch_and_explicit __c11_atomic_fetch_and |
160 | |
161 | |
162 | |
163 | typedef struct atomic_flag { atomic_bool _Value; } atomic_flag; |
164 | |
165 | #define ATOMIC_FLAG_INIT { 0 } |
166 | |
167 | |
168 | #ifdef __cplusplus |
169 | bool atomic_flag_test_and_set(volatile atomic_flag *); |
170 | bool atomic_flag_test_and_set_explicit(volatile atomic_flag *, memory_order); |
171 | #else |
172 | _Bool atomic_flag_test_and_set(volatile atomic_flag *); |
173 | _Bool atomic_flag_test_and_set_explicit(volatile atomic_flag *, memory_order); |
174 | #endif |
175 | void atomic_flag_clear(volatile atomic_flag *); |
176 | void atomic_flag_clear_explicit(volatile atomic_flag *, memory_order); |
177 | |
178 | #define atomic_flag_test_and_set(object) __c11_atomic_exchange(&(object)->_Value, 1, __ATOMIC_SEQ_CST) |
179 | #define atomic_flag_test_and_set_explicit(object, order) __c11_atomic_exchange(&(object)->_Value, 1, order) |
180 | |
181 | #define atomic_flag_clear(object) __c11_atomic_store(&(object)->_Value, 0, __ATOMIC_SEQ_CST) |
182 | #define atomic_flag_clear_explicit(object, order) __c11_atomic_store(&(object)->_Value, 0, order) |
183 | |
184 | #ifdef __cplusplus |
185 | } |
186 | #endif |
187 | |
188 | #endif |
189 | #endif |
190 | |
191 | |