1*8d67ca89SAndroid Build Coastguard Worker /*-
2*8d67ca89SAndroid Build Coastguard Worker * Copyright (c) 2011 Ed Schouten <[email protected]>
3*8d67ca89SAndroid Build Coastguard Worker * David Chisnall <[email protected]>
4*8d67ca89SAndroid Build Coastguard Worker * All rights reserved.
5*8d67ca89SAndroid Build Coastguard Worker *
6*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
7*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions
8*8d67ca89SAndroid Build Coastguard Worker * are met:
9*8d67ca89SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
10*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
11*8d67ca89SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
12*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
13*8d67ca89SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
14*8d67ca89SAndroid Build Coastguard Worker *
15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*8d67ca89SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*8d67ca89SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*8d67ca89SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*8d67ca89SAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*8d67ca89SAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*8d67ca89SAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*8d67ca89SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*8d67ca89SAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*8d67ca89SAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE.
26*8d67ca89SAndroid Build Coastguard Worker *
27*8d67ca89SAndroid Build Coastguard Worker * $FreeBSD$
28*8d67ca89SAndroid Build Coastguard Worker */
29*8d67ca89SAndroid Build Coastguard Worker
30*8d67ca89SAndroid Build Coastguard Worker #pragma once
31*8d67ca89SAndroid Build Coastguard Worker
32*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
33*8d67ca89SAndroid Build Coastguard Worker #include <sys/types.h>
34*8d67ca89SAndroid Build Coastguard Worker #include <stdbool.h>
35*8d67ca89SAndroid Build Coastguard Worker
36*8d67ca89SAndroid Build Coastguard Worker /*
37*8d67ca89SAndroid Build Coastguard Worker * C: Do it ourselves.
38*8d67ca89SAndroid Build Coastguard Worker * Note that the runtime representation defined here should be compatible
39*8d67ca89SAndroid Build Coastguard Worker * with the C++ one, i.e. an _Atomic(T) needs to contain the same
40*8d67ca89SAndroid Build Coastguard Worker * bits as a T.
41*8d67ca89SAndroid Build Coastguard Worker */
42*8d67ca89SAndroid Build Coastguard Worker
43*8d67ca89SAndroid Build Coastguard Worker #include <stddef.h> /* For ptrdiff_t. */
44*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h>
45*8d67ca89SAndroid Build Coastguard Worker // Include uchar.h only when available. Bionic's stdatomic.h is also used for
46*8d67ca89SAndroid Build Coastguard Worker // the host (via a copy in prebuilts/clang) and uchar.h is not available in the
47*8d67ca89SAndroid Build Coastguard Worker // glibc used for the host.
48*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__)
49*8d67ca89SAndroid Build Coastguard Worker # include <uchar.h> /* For char16_t and char32_t. */
50*8d67ca89SAndroid Build Coastguard Worker #endif
51*8d67ca89SAndroid Build Coastguard Worker
52*8d67ca89SAndroid Build Coastguard Worker /*
53*8d67ca89SAndroid Build Coastguard Worker * 7.17.1 Atomic lock-free macros.
54*8d67ca89SAndroid Build Coastguard Worker */
55*8d67ca89SAndroid Build Coastguard Worker
56*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_BOOL_LOCK_FREE
57*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
58*8d67ca89SAndroid Build Coastguard Worker #endif
59*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_CHAR_LOCK_FREE
60*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
61*8d67ca89SAndroid Build Coastguard Worker #endif
62*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_CHAR16_T_LOCK_FREE
63*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
64*8d67ca89SAndroid Build Coastguard Worker #endif
65*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_CHAR32_T_LOCK_FREE
66*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE
67*8d67ca89SAndroid Build Coastguard Worker #endif
68*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_WCHAR_T_LOCK_FREE
69*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE
70*8d67ca89SAndroid Build Coastguard Worker #endif
71*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_SHORT_LOCK_FREE
72*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE
73*8d67ca89SAndroid Build Coastguard Worker #endif
74*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_INT_LOCK_FREE
75*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
76*8d67ca89SAndroid Build Coastguard Worker #endif
77*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_LONG_LOCK_FREE
78*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE
79*8d67ca89SAndroid Build Coastguard Worker #endif
80*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_LLONG_LOCK_FREE
81*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
82*8d67ca89SAndroid Build Coastguard Worker #endif
83*8d67ca89SAndroid Build Coastguard Worker #ifdef __GCC_ATOMIC_POINTER_LOCK_FREE
84*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
85*8d67ca89SAndroid Build Coastguard Worker #endif
86*8d67ca89SAndroid Build Coastguard Worker
87*8d67ca89SAndroid Build Coastguard Worker /*
88*8d67ca89SAndroid Build Coastguard Worker * 7.17.2 Initialization.
89*8d67ca89SAndroid Build Coastguard Worker */
90*8d67ca89SAndroid Build Coastguard Worker
91*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_VAR_INIT(value) (value)
92*8d67ca89SAndroid Build Coastguard Worker #define atomic_init(obj, value) __c11_atomic_init(obj, value)
93*8d67ca89SAndroid Build Coastguard Worker
94*8d67ca89SAndroid Build Coastguard Worker /*
95*8d67ca89SAndroid Build Coastguard Worker * Clang and recent GCC both provide predefined macros for the memory
96*8d67ca89SAndroid Build Coastguard Worker * orderings. If we are using a compiler that doesn't define them, use the
97*8d67ca89SAndroid Build Coastguard Worker * clang values - these will be ignored in the fallback path.
98*8d67ca89SAndroid Build Coastguard Worker */
99*8d67ca89SAndroid Build Coastguard Worker
100*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_RELAXED
101*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_RELAXED 0
102*8d67ca89SAndroid Build Coastguard Worker #endif
103*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_CONSUME
104*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_CONSUME 1
105*8d67ca89SAndroid Build Coastguard Worker #endif
106*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_ACQUIRE
107*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_ACQUIRE 2
108*8d67ca89SAndroid Build Coastguard Worker #endif
109*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_RELEASE
110*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_RELEASE 3
111*8d67ca89SAndroid Build Coastguard Worker #endif
112*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_ACQ_REL
113*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_ACQ_REL 4
114*8d67ca89SAndroid Build Coastguard Worker #endif
115*8d67ca89SAndroid Build Coastguard Worker #ifndef __ATOMIC_SEQ_CST
116*8d67ca89SAndroid Build Coastguard Worker #define __ATOMIC_SEQ_CST 5
117*8d67ca89SAndroid Build Coastguard Worker #endif
118*8d67ca89SAndroid Build Coastguard Worker
119*8d67ca89SAndroid Build Coastguard Worker /*
120*8d67ca89SAndroid Build Coastguard Worker * 7.17.3 Order and consistency.
121*8d67ca89SAndroid Build Coastguard Worker *
122*8d67ca89SAndroid Build Coastguard Worker * The memory_order_* constants that denote the barrier behaviour of the
123*8d67ca89SAndroid Build Coastguard Worker * atomic operations.
124*8d67ca89SAndroid Build Coastguard Worker * The enum values must be identical to those used by the
125*8d67ca89SAndroid Build Coastguard Worker * C++ <atomic> header.
126*8d67ca89SAndroid Build Coastguard Worker */
127*8d67ca89SAndroid Build Coastguard Worker
128*8d67ca89SAndroid Build Coastguard Worker typedef enum {
129*8d67ca89SAndroid Build Coastguard Worker memory_order_relaxed = __ATOMIC_RELAXED,
130*8d67ca89SAndroid Build Coastguard Worker memory_order_consume = __ATOMIC_CONSUME,
131*8d67ca89SAndroid Build Coastguard Worker memory_order_acquire = __ATOMIC_ACQUIRE,
132*8d67ca89SAndroid Build Coastguard Worker memory_order_release = __ATOMIC_RELEASE,
133*8d67ca89SAndroid Build Coastguard Worker memory_order_acq_rel = __ATOMIC_ACQ_REL,
134*8d67ca89SAndroid Build Coastguard Worker memory_order_seq_cst = __ATOMIC_SEQ_CST
135*8d67ca89SAndroid Build Coastguard Worker } memory_order;
136*8d67ca89SAndroid Build Coastguard Worker
137*8d67ca89SAndroid Build Coastguard Worker #define kill_dependency(y) (y)
138*8d67ca89SAndroid Build Coastguard Worker
139*8d67ca89SAndroid Build Coastguard Worker /*
140*8d67ca89SAndroid Build Coastguard Worker * 7.17.4 Fences.
141*8d67ca89SAndroid Build Coastguard Worker */
142*8d67ca89SAndroid Build Coastguard Worker
atomic_thread_fence(memory_order __order)143*8d67ca89SAndroid Build Coastguard Worker static __inline void atomic_thread_fence(memory_order __order __attribute__((__unused__))) {
144*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_thread_fence(__order);
145*8d67ca89SAndroid Build Coastguard Worker }
146*8d67ca89SAndroid Build Coastguard Worker
atomic_signal_fence(memory_order __order)147*8d67ca89SAndroid Build Coastguard Worker static __inline void atomic_signal_fence(memory_order __order __attribute__((__unused__))) {
148*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_signal_fence(__order);
149*8d67ca89SAndroid Build Coastguard Worker }
150*8d67ca89SAndroid Build Coastguard Worker
151*8d67ca89SAndroid Build Coastguard Worker /*
152*8d67ca89SAndroid Build Coastguard Worker * 7.17.5 Lock-free property.
153*8d67ca89SAndroid Build Coastguard Worker */
154*8d67ca89SAndroid Build Coastguard Worker
155*8d67ca89SAndroid Build Coastguard Worker #define atomic_is_lock_free(obj) __c11_atomic_is_lock_free(sizeof(*(obj)))
156*8d67ca89SAndroid Build Coastguard Worker
157*8d67ca89SAndroid Build Coastguard Worker /*
158*8d67ca89SAndroid Build Coastguard Worker * 7.17.6 Atomic integer types.
159*8d67ca89SAndroid Build Coastguard Worker */
160*8d67ca89SAndroid Build Coastguard Worker
161*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(bool) atomic_bool;
162*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(char) atomic_char;
163*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(signed char) atomic_schar;
164*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(unsigned char) atomic_uchar;
165*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(short) atomic_short;
166*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(unsigned short) atomic_ushort;
167*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int) atomic_int;
168*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(unsigned int) atomic_uint;
169*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(long) atomic_long;
170*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(unsigned long) atomic_ulong;
171*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(long long) atomic_llong;
172*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(unsigned long long) atomic_ullong;
173*8d67ca89SAndroid Build Coastguard Worker #if defined(__BIONIC__) || (defined(__cplusplus) && __cplusplus >= 201103L)
174*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(char16_t) atomic_char16_t;
175*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(char32_t) atomic_char32_t;
176*8d67ca89SAndroid Build Coastguard Worker #endif
177*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(wchar_t) atomic_wchar_t;
178*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_least8_t) atomic_int_least8_t;
179*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_least8_t) atomic_uint_least8_t;
180*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_least16_t) atomic_int_least16_t;
181*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_least16_t) atomic_uint_least16_t;
182*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_least32_t) atomic_int_least32_t;
183*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_least32_t) atomic_uint_least32_t;
184*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_least64_t) atomic_int_least64_t;
185*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_least64_t) atomic_uint_least64_t;
186*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_fast8_t) atomic_int_fast8_t;
187*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t;
188*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_fast16_t) atomic_int_fast16_t;
189*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t;
190*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_fast32_t) atomic_int_fast32_t;
191*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t;
192*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(int_fast64_t) atomic_int_fast64_t;
193*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t;
194*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(intptr_t) atomic_intptr_t;
195*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uintptr_t) atomic_uintptr_t;
196*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(size_t) atomic_size_t;
197*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t;
198*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(intmax_t) atomic_intmax_t;
199*8d67ca89SAndroid Build Coastguard Worker typedef _Atomic(uintmax_t) atomic_uintmax_t;
200*8d67ca89SAndroid Build Coastguard Worker
201*8d67ca89SAndroid Build Coastguard Worker /*
202*8d67ca89SAndroid Build Coastguard Worker * 7.17.7 Operations on atomic types.
203*8d67ca89SAndroid Build Coastguard Worker */
204*8d67ca89SAndroid Build Coastguard Worker
205*8d67ca89SAndroid Build Coastguard Worker /*
206*8d67ca89SAndroid Build Coastguard Worker * Compiler-specific operations.
207*8d67ca89SAndroid Build Coastguard Worker */
208*8d67ca89SAndroid Build Coastguard Worker
209*8d67ca89SAndroid Build Coastguard Worker #define atomic_compare_exchange_strong_explicit(object, expected, \
210*8d67ca89SAndroid Build Coastguard Worker desired, success, failure) \
211*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_compare_exchange_strong(object, expected, desired, \
212*8d67ca89SAndroid Build Coastguard Worker success, failure)
213*8d67ca89SAndroid Build Coastguard Worker #define atomic_compare_exchange_weak_explicit(object, expected, \
214*8d67ca89SAndroid Build Coastguard Worker desired, success, failure) \
215*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_compare_exchange_weak(object, expected, desired, \
216*8d67ca89SAndroid Build Coastguard Worker success, failure)
217*8d67ca89SAndroid Build Coastguard Worker #define atomic_exchange_explicit(object, desired, order) \
218*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_exchange(object, desired, order)
219*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_add_explicit(object, operand, order) \
220*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_fetch_add(object, operand, order)
221*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_and_explicit(object, operand, order) \
222*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_fetch_and(object, operand, order)
223*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_or_explicit(object, operand, order) \
224*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_fetch_or(object, operand, order)
225*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_sub_explicit(object, operand, order) \
226*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_fetch_sub(object, operand, order)
227*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_xor_explicit(object, operand, order) \
228*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_fetch_xor(object, operand, order)
229*8d67ca89SAndroid Build Coastguard Worker #define atomic_load_explicit(object, order) \
230*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_load(object, order)
231*8d67ca89SAndroid Build Coastguard Worker #define atomic_store_explicit(object, desired, order) \
232*8d67ca89SAndroid Build Coastguard Worker __c11_atomic_store(object, desired, order)
233*8d67ca89SAndroid Build Coastguard Worker
234*8d67ca89SAndroid Build Coastguard Worker /*
235*8d67ca89SAndroid Build Coastguard Worker * Convenience functions.
236*8d67ca89SAndroid Build Coastguard Worker */
237*8d67ca89SAndroid Build Coastguard Worker
238*8d67ca89SAndroid Build Coastguard Worker #define atomic_compare_exchange_strong(object, expected, desired) \
239*8d67ca89SAndroid Build Coastguard Worker atomic_compare_exchange_strong_explicit(object, expected, \
240*8d67ca89SAndroid Build Coastguard Worker desired, memory_order_seq_cst, memory_order_seq_cst)
241*8d67ca89SAndroid Build Coastguard Worker #define atomic_compare_exchange_weak(object, expected, desired) \
242*8d67ca89SAndroid Build Coastguard Worker atomic_compare_exchange_weak_explicit(object, expected, \
243*8d67ca89SAndroid Build Coastguard Worker desired, memory_order_seq_cst, memory_order_seq_cst)
244*8d67ca89SAndroid Build Coastguard Worker #define atomic_exchange(object, desired) \
245*8d67ca89SAndroid Build Coastguard Worker atomic_exchange_explicit(object, desired, memory_order_seq_cst)
246*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_add(object, operand) \
247*8d67ca89SAndroid Build Coastguard Worker atomic_fetch_add_explicit(object, operand, memory_order_seq_cst)
248*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_and(object, operand) \
249*8d67ca89SAndroid Build Coastguard Worker atomic_fetch_and_explicit(object, operand, memory_order_seq_cst)
250*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_or(object, operand) \
251*8d67ca89SAndroid Build Coastguard Worker atomic_fetch_or_explicit(object, operand, memory_order_seq_cst)
252*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_sub(object, operand) \
253*8d67ca89SAndroid Build Coastguard Worker atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst)
254*8d67ca89SAndroid Build Coastguard Worker #define atomic_fetch_xor(object, operand) \
255*8d67ca89SAndroid Build Coastguard Worker atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst)
256*8d67ca89SAndroid Build Coastguard Worker #define atomic_load(object) \
257*8d67ca89SAndroid Build Coastguard Worker atomic_load_explicit(object, memory_order_seq_cst)
258*8d67ca89SAndroid Build Coastguard Worker #define atomic_store(object, desired) \
259*8d67ca89SAndroid Build Coastguard Worker atomic_store_explicit(object, desired, memory_order_seq_cst)
260*8d67ca89SAndroid Build Coastguard Worker
261*8d67ca89SAndroid Build Coastguard Worker /*
262*8d67ca89SAndroid Build Coastguard Worker * 7.17.8 Atomic flag type and operations.
263*8d67ca89SAndroid Build Coastguard Worker *
264*8d67ca89SAndroid Build Coastguard Worker * XXX: Assume atomic_bool can be used as an atomic_flag. Is there some
265*8d67ca89SAndroid Build Coastguard Worker * kind of compiler built-in type we could use?
266*8d67ca89SAndroid Build Coastguard Worker */
267*8d67ca89SAndroid Build Coastguard Worker
268*8d67ca89SAndroid Build Coastguard Worker typedef struct {
269*8d67ca89SAndroid Build Coastguard Worker atomic_bool __flag;
270*8d67ca89SAndroid Build Coastguard Worker } atomic_flag;
271*8d67ca89SAndroid Build Coastguard Worker
272*8d67ca89SAndroid Build Coastguard Worker #define ATOMIC_FLAG_INIT { ATOMIC_VAR_INIT(false) }
273*8d67ca89SAndroid Build Coastguard Worker
atomic_flag_test_and_set_explicit(volatile atomic_flag * _Nonnull __object,memory_order __order)274*8d67ca89SAndroid Build Coastguard Worker static __inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag * _Nonnull __object, memory_order __order) {
275*8d67ca89SAndroid Build Coastguard Worker return (atomic_exchange_explicit(&__object->__flag, 1, __order));
276*8d67ca89SAndroid Build Coastguard Worker }
277*8d67ca89SAndroid Build Coastguard Worker
atomic_flag_clear_explicit(volatile atomic_flag * _Nonnull __object,memory_order __order)278*8d67ca89SAndroid Build Coastguard Worker static __inline void atomic_flag_clear_explicit(volatile atomic_flag * _Nonnull __object, memory_order __order) {
279*8d67ca89SAndroid Build Coastguard Worker atomic_store_explicit(&__object->__flag, 0, __order);
280*8d67ca89SAndroid Build Coastguard Worker }
281*8d67ca89SAndroid Build Coastguard Worker
atomic_flag_test_and_set(volatile atomic_flag * _Nonnull __object)282*8d67ca89SAndroid Build Coastguard Worker static __inline bool atomic_flag_test_and_set(volatile atomic_flag * _Nonnull __object) {
283*8d67ca89SAndroid Build Coastguard Worker return (atomic_flag_test_and_set_explicit(__object, memory_order_seq_cst));
284*8d67ca89SAndroid Build Coastguard Worker }
285*8d67ca89SAndroid Build Coastguard Worker
atomic_flag_clear(volatile atomic_flag * _Nonnull __object)286*8d67ca89SAndroid Build Coastguard Worker static __inline void atomic_flag_clear(volatile atomic_flag * _Nonnull __object) {
287*8d67ca89SAndroid Build Coastguard Worker atomic_flag_clear_explicit(__object, memory_order_seq_cst);
288*8d67ca89SAndroid Build Coastguard Worker }
289