xref: /aosp_15_r20/bionic/libc/include/bits/stdatomic.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
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