xref: /openbsd/gnu/llvm/libcxx/include/stdatomic.h (revision 4bdff4be)
1*4bdff4beSrobert // -*- C++ -*-
2*4bdff4beSrobert //===----------------------------------------------------------------------===//
3*4bdff4beSrobert //
4*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
6*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*4bdff4beSrobert //
8*4bdff4beSrobert //===----------------------------------------------------------------------===//
9*4bdff4beSrobert 
10*4bdff4beSrobert #ifndef _LIBCPP_STDATOMIC_H
11*4bdff4beSrobert #define _LIBCPP_STDATOMIC_H
12*4bdff4beSrobert 
13*4bdff4beSrobert /*
14*4bdff4beSrobert     stdatomic.h synopsis
15*4bdff4beSrobert 
16*4bdff4beSrobert template<class T>
17*4bdff4beSrobert   using std-atomic = std::atomic<T>;        // exposition only
18*4bdff4beSrobert 
19*4bdff4beSrobert #define _Atomic(T) std-atomic<T>
20*4bdff4beSrobert 
21*4bdff4beSrobert #define ATOMIC_BOOL_LOCK_FREE see below
22*4bdff4beSrobert #define ATOMIC_CHAR_LOCK_FREE see below
23*4bdff4beSrobert #define ATOMIC_CHAR16_T_LOCK_FREE see below
24*4bdff4beSrobert #define ATOMIC_CHAR32_T_LOCK_FREE see below
25*4bdff4beSrobert #define ATOMIC_WCHAR_T_LOCK_FREE see below
26*4bdff4beSrobert #define ATOMIC_SHORT_LOCK_FREE see below
27*4bdff4beSrobert #define ATOMIC_INT_LOCK_FREE see below
28*4bdff4beSrobert #define ATOMIC_LONG_LOCK_FREE see below
29*4bdff4beSrobert #define ATOMIC_LLONG_LOCK_FREE see below
30*4bdff4beSrobert #define ATOMIC_POINTER_LOCK_FREE see below
31*4bdff4beSrobert 
32*4bdff4beSrobert using std::memory_order                // see below
33*4bdff4beSrobert using std::memory_order_relaxed        // see below
34*4bdff4beSrobert using std::memory_order_consume        // see below
35*4bdff4beSrobert using std::memory_order_acquire        // see below
36*4bdff4beSrobert using std::memory_order_release        // see below
37*4bdff4beSrobert using std::memory_order_acq_rel        // see below
38*4bdff4beSrobert using std::memory_order_seq_cst        // see below
39*4bdff4beSrobert 
40*4bdff4beSrobert using std::atomic_flag                 // see below
41*4bdff4beSrobert 
42*4bdff4beSrobert using std::atomic_bool                 // see below
43*4bdff4beSrobert using std::atomic_char                 // see below
44*4bdff4beSrobert using std::atomic_schar                // see below
45*4bdff4beSrobert using std::atomic_uchar                // see below
46*4bdff4beSrobert using std::atomic_short                // see below
47*4bdff4beSrobert using std::atomic_ushort               // see below
48*4bdff4beSrobert using std::atomic_int                  // see below
49*4bdff4beSrobert using std::atomic_uint                 // see below
50*4bdff4beSrobert using std::atomic_long                 // see below
51*4bdff4beSrobert using std::atomic_ulong                // see below
52*4bdff4beSrobert using std::atomic_llong                // see below
53*4bdff4beSrobert using std::atomic_ullong               // see below
54*4bdff4beSrobert using std::atomic_char8_t              // see below
55*4bdff4beSrobert using std::atomic_char16_t             // see below
56*4bdff4beSrobert using std::atomic_char32_t             // see below
57*4bdff4beSrobert using std::atomic_wchar_t              // see below
58*4bdff4beSrobert using std::atomic_int8_t               // see below
59*4bdff4beSrobert using std::atomic_uint8_t              // see below
60*4bdff4beSrobert using std::atomic_int16_t              // see below
61*4bdff4beSrobert using std::atomic_uint16_t             // see below
62*4bdff4beSrobert using std::atomic_int32_t              // see below
63*4bdff4beSrobert using std::atomic_uint32_t             // see below
64*4bdff4beSrobert using std::atomic_int64_t              // see below
65*4bdff4beSrobert using std::atomic_uint64_t             // see below
66*4bdff4beSrobert using std::atomic_int_least8_t         // see below
67*4bdff4beSrobert using std::atomic_uint_least8_t        // see below
68*4bdff4beSrobert using std::atomic_int_least16_t        // see below
69*4bdff4beSrobert using std::atomic_uint_least16_t       // see below
70*4bdff4beSrobert using std::atomic_int_least32_t        // see below
71*4bdff4beSrobert using std::atomic_uint_least32_t       // see below
72*4bdff4beSrobert using std::atomic_int_least64_t        // see below
73*4bdff4beSrobert using std::atomic_uint_least64_t       // see below
74*4bdff4beSrobert using std::atomic_int_fast8_t          // see below
75*4bdff4beSrobert using std::atomic_uint_fast8_t         // see below
76*4bdff4beSrobert using std::atomic_int_fast16_t         // see below
77*4bdff4beSrobert using std::atomic_uint_fast16_t        // see below
78*4bdff4beSrobert using std::atomic_int_fast32_t         // see below
79*4bdff4beSrobert using std::atomic_uint_fast32_t        // see below
80*4bdff4beSrobert using std::atomic_int_fast64_t         // see below
81*4bdff4beSrobert using std::atomic_uint_fast64_t        // see below
82*4bdff4beSrobert using std::atomic_intptr_t             // see below
83*4bdff4beSrobert using std::atomic_uintptr_t            // see below
84*4bdff4beSrobert using std::atomic_size_t               // see below
85*4bdff4beSrobert using std::atomic_ptrdiff_t            // see below
86*4bdff4beSrobert using std::atomic_intmax_t             // see below
87*4bdff4beSrobert using std::atomic_uintmax_t            // see below
88*4bdff4beSrobert 
89*4bdff4beSrobert using std::atomic_is_lock_free                         // see below
90*4bdff4beSrobert using std::atomic_load                                 // see below
91*4bdff4beSrobert using std::atomic_load_explicit                        // see below
92*4bdff4beSrobert using std::atomic_store                                // see below
93*4bdff4beSrobert using std::atomic_store_explicit                       // see below
94*4bdff4beSrobert using std::atomic_exchange                             // see below
95*4bdff4beSrobert using std::atomic_exchange_explicit                    // see below
96*4bdff4beSrobert using std::atomic_compare_exchange_strong              // see below
97*4bdff4beSrobert using std::atomic_compare_exchange_strong_explicit     // see below
98*4bdff4beSrobert using std::atomic_compare_exchange_weak                // see below
99*4bdff4beSrobert using std::atomic_compare_exchange_weak_explicit       // see below
100*4bdff4beSrobert using std::atomic_fetch_add                            // see below
101*4bdff4beSrobert using std::atomic_fetch_add_explicit                   // see below
102*4bdff4beSrobert using std::atomic_fetch_sub                            // see below
103*4bdff4beSrobert using std::atomic_fetch_sub_explicit                   // see below
104*4bdff4beSrobert using std::atomic_fetch_or                             // see below
105*4bdff4beSrobert using std::atomic_fetch_or_explicit                    // see below
106*4bdff4beSrobert using std::atomic_fetch_and                            // see below
107*4bdff4beSrobert using std::atomic_fetch_and_explicit                   // see below
108*4bdff4beSrobert using std::atomic_flag_test_and_set                    // see below
109*4bdff4beSrobert using std::atomic_flag_test_and_set_explicit           // see below
110*4bdff4beSrobert using std::atomic_flag_clear                           // see below
111*4bdff4beSrobert using std::atomic_flag_clear_explicit                  // see below
112*4bdff4beSrobert 
113*4bdff4beSrobert using std::atomic_thread_fence                         // see below
114*4bdff4beSrobert using std::atomic_signal_fence                         // see below
115*4bdff4beSrobert 
116*4bdff4beSrobert */
117*4bdff4beSrobert 
118*4bdff4beSrobert #include <__config>
119*4bdff4beSrobert 
120*4bdff4beSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
121*4bdff4beSrobert #  pragma GCC system_header
122*4bdff4beSrobert #endif
123*4bdff4beSrobert 
124*4bdff4beSrobert #if defined(__cplusplus) && _LIBCPP_STD_VER > 20
125*4bdff4beSrobert 
126*4bdff4beSrobert #include <atomic>
127*4bdff4beSrobert #include <version>
128*4bdff4beSrobert 
129*4bdff4beSrobert #ifdef _Atomic
130*4bdff4beSrobert # undef _Atomic
131*4bdff4beSrobert #endif
132*4bdff4beSrobert 
133*4bdff4beSrobert #define _Atomic(_Tp) ::std::atomic<_Tp>
134*4bdff4beSrobert 
135*4bdff4beSrobert using std::memory_order _LIBCPP_USING_IF_EXISTS;
136*4bdff4beSrobert using std::memory_order_relaxed _LIBCPP_USING_IF_EXISTS;
137*4bdff4beSrobert using std::memory_order_consume _LIBCPP_USING_IF_EXISTS;
138*4bdff4beSrobert using std::memory_order_acquire _LIBCPP_USING_IF_EXISTS;
139*4bdff4beSrobert using std::memory_order_release _LIBCPP_USING_IF_EXISTS;
140*4bdff4beSrobert using std::memory_order_acq_rel _LIBCPP_USING_IF_EXISTS;
141*4bdff4beSrobert using std::memory_order_seq_cst _LIBCPP_USING_IF_EXISTS;
142*4bdff4beSrobert 
143*4bdff4beSrobert using std::atomic_flag _LIBCPP_USING_IF_EXISTS;
144*4bdff4beSrobert 
145*4bdff4beSrobert using std::atomic_bool _LIBCPP_USING_IF_EXISTS;
146*4bdff4beSrobert using std::atomic_char _LIBCPP_USING_IF_EXISTS;
147*4bdff4beSrobert using std::atomic_schar _LIBCPP_USING_IF_EXISTS;
148*4bdff4beSrobert using std::atomic_uchar _LIBCPP_USING_IF_EXISTS;
149*4bdff4beSrobert using std::atomic_short _LIBCPP_USING_IF_EXISTS;
150*4bdff4beSrobert using std::atomic_ushort _LIBCPP_USING_IF_EXISTS;
151*4bdff4beSrobert using std::atomic_int _LIBCPP_USING_IF_EXISTS;
152*4bdff4beSrobert using std::atomic_uint _LIBCPP_USING_IF_EXISTS;
153*4bdff4beSrobert using std::atomic_long _LIBCPP_USING_IF_EXISTS;
154*4bdff4beSrobert using std::atomic_ulong _LIBCPP_USING_IF_EXISTS;
155*4bdff4beSrobert using std::atomic_llong _LIBCPP_USING_IF_EXISTS;
156*4bdff4beSrobert using std::atomic_ullong _LIBCPP_USING_IF_EXISTS;
157*4bdff4beSrobert using std::atomic_char8_t _LIBCPP_USING_IF_EXISTS;
158*4bdff4beSrobert using std::atomic_char16_t _LIBCPP_USING_IF_EXISTS;
159*4bdff4beSrobert using std::atomic_char32_t _LIBCPP_USING_IF_EXISTS;
160*4bdff4beSrobert using std::atomic_wchar_t _LIBCPP_USING_IF_EXISTS;
161*4bdff4beSrobert 
162*4bdff4beSrobert using std::atomic_int8_t _LIBCPP_USING_IF_EXISTS;
163*4bdff4beSrobert using std::atomic_uint8_t _LIBCPP_USING_IF_EXISTS;
164*4bdff4beSrobert using std::atomic_int16_t _LIBCPP_USING_IF_EXISTS;
165*4bdff4beSrobert using std::atomic_uint16_t _LIBCPP_USING_IF_EXISTS;
166*4bdff4beSrobert using std::atomic_int32_t _LIBCPP_USING_IF_EXISTS;
167*4bdff4beSrobert using std::atomic_uint32_t _LIBCPP_USING_IF_EXISTS;
168*4bdff4beSrobert using std::atomic_int64_t _LIBCPP_USING_IF_EXISTS;
169*4bdff4beSrobert using std::atomic_uint64_t _LIBCPP_USING_IF_EXISTS;
170*4bdff4beSrobert 
171*4bdff4beSrobert using std::atomic_int_least8_t _LIBCPP_USING_IF_EXISTS;
172*4bdff4beSrobert using std::atomic_uint_least8_t _LIBCPP_USING_IF_EXISTS;
173*4bdff4beSrobert using std::atomic_int_least16_t _LIBCPP_USING_IF_EXISTS;
174*4bdff4beSrobert using std::atomic_uint_least16_t _LIBCPP_USING_IF_EXISTS;
175*4bdff4beSrobert using std::atomic_int_least32_t _LIBCPP_USING_IF_EXISTS;
176*4bdff4beSrobert using std::atomic_uint_least32_t _LIBCPP_USING_IF_EXISTS;
177*4bdff4beSrobert using std::atomic_int_least64_t _LIBCPP_USING_IF_EXISTS;
178*4bdff4beSrobert using std::atomic_uint_least64_t _LIBCPP_USING_IF_EXISTS;
179*4bdff4beSrobert 
180*4bdff4beSrobert using std::atomic_int_fast8_t _LIBCPP_USING_IF_EXISTS;
181*4bdff4beSrobert using std::atomic_uint_fast8_t _LIBCPP_USING_IF_EXISTS;
182*4bdff4beSrobert using std::atomic_int_fast16_t _LIBCPP_USING_IF_EXISTS;
183*4bdff4beSrobert using std::atomic_uint_fast16_t _LIBCPP_USING_IF_EXISTS;
184*4bdff4beSrobert using std::atomic_int_fast32_t _LIBCPP_USING_IF_EXISTS;
185*4bdff4beSrobert using std::atomic_uint_fast32_t _LIBCPP_USING_IF_EXISTS;
186*4bdff4beSrobert using std::atomic_int_fast64_t _LIBCPP_USING_IF_EXISTS;
187*4bdff4beSrobert using std::atomic_uint_fast64_t _LIBCPP_USING_IF_EXISTS;
188*4bdff4beSrobert 
189*4bdff4beSrobert using std::atomic_intptr_t _LIBCPP_USING_IF_EXISTS;
190*4bdff4beSrobert using std::atomic_uintptr_t _LIBCPP_USING_IF_EXISTS;
191*4bdff4beSrobert using std::atomic_size_t _LIBCPP_USING_IF_EXISTS;
192*4bdff4beSrobert using std::atomic_ptrdiff_t _LIBCPP_USING_IF_EXISTS;
193*4bdff4beSrobert using std::atomic_intmax_t _LIBCPP_USING_IF_EXISTS;
194*4bdff4beSrobert using std::atomic_uintmax_t _LIBCPP_USING_IF_EXISTS;
195*4bdff4beSrobert 
196*4bdff4beSrobert using std::atomic_compare_exchange_strong _LIBCPP_USING_IF_EXISTS;
197*4bdff4beSrobert using std::atomic_compare_exchange_strong_explicit _LIBCPP_USING_IF_EXISTS;
198*4bdff4beSrobert using std::atomic_compare_exchange_weak _LIBCPP_USING_IF_EXISTS;
199*4bdff4beSrobert using std::atomic_compare_exchange_weak_explicit _LIBCPP_USING_IF_EXISTS;
200*4bdff4beSrobert using std::atomic_exchange _LIBCPP_USING_IF_EXISTS;
201*4bdff4beSrobert using std::atomic_exchange_explicit _LIBCPP_USING_IF_EXISTS;
202*4bdff4beSrobert using std::atomic_fetch_add _LIBCPP_USING_IF_EXISTS;
203*4bdff4beSrobert using std::atomic_fetch_add_explicit _LIBCPP_USING_IF_EXISTS;
204*4bdff4beSrobert using std::atomic_fetch_and _LIBCPP_USING_IF_EXISTS;
205*4bdff4beSrobert using std::atomic_fetch_and_explicit _LIBCPP_USING_IF_EXISTS;
206*4bdff4beSrobert using std::atomic_fetch_or _LIBCPP_USING_IF_EXISTS;
207*4bdff4beSrobert using std::atomic_fetch_or_explicit _LIBCPP_USING_IF_EXISTS;
208*4bdff4beSrobert using std::atomic_fetch_sub _LIBCPP_USING_IF_EXISTS;
209*4bdff4beSrobert using std::atomic_fetch_sub_explicit _LIBCPP_USING_IF_EXISTS;
210*4bdff4beSrobert using std::atomic_flag_clear _LIBCPP_USING_IF_EXISTS;
211*4bdff4beSrobert using std::atomic_flag_clear_explicit _LIBCPP_USING_IF_EXISTS;
212*4bdff4beSrobert using std::atomic_flag_test_and_set _LIBCPP_USING_IF_EXISTS;
213*4bdff4beSrobert using std::atomic_flag_test_and_set_explicit _LIBCPP_USING_IF_EXISTS;
214*4bdff4beSrobert using std::atomic_is_lock_free _LIBCPP_USING_IF_EXISTS;
215*4bdff4beSrobert using std::atomic_load _LIBCPP_USING_IF_EXISTS;
216*4bdff4beSrobert using std::atomic_load_explicit _LIBCPP_USING_IF_EXISTS;
217*4bdff4beSrobert using std::atomic_store _LIBCPP_USING_IF_EXISTS;
218*4bdff4beSrobert using std::atomic_store_explicit _LIBCPP_USING_IF_EXISTS;
219*4bdff4beSrobert 
220*4bdff4beSrobert using std::atomic_signal_fence _LIBCPP_USING_IF_EXISTS;
221*4bdff4beSrobert using std::atomic_thread_fence _LIBCPP_USING_IF_EXISTS;
222*4bdff4beSrobert 
223*4bdff4beSrobert #elif defined(_LIBCPP_COMPILER_CLANG_BASED)
224*4bdff4beSrobert 
225*4bdff4beSrobert // Before C++23, we include the next <stdatomic.h> on the path to avoid hijacking
226*4bdff4beSrobert // the header. We do this because Clang has historically shipped a <stdatomic.h>
227*4bdff4beSrobert // header that would be available in all Standard modes, and we don't want to
228*4bdff4beSrobert // break that use case.
229*4bdff4beSrobert # if __has_include_next(<stdatomic.h>)
230*4bdff4beSrobert #   include_next <stdatomic.h>
231*4bdff4beSrobert # endif
232*4bdff4beSrobert 
233*4bdff4beSrobert #endif // defined(__cplusplus) && _LIBCPP_STD_VER > 20
234*4bdff4beSrobert 
235*4bdff4beSrobert #endif // _LIBCPP_STDATOMIC_H
236