1*0e34f3f4SLouis Dionne //===----------------------------------------------------------------------===// 2*0e34f3f4SLouis Dionne // 3*0e34f3f4SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0e34f3f4SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*0e34f3f4SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0e34f3f4SLouis Dionne // 7*0e34f3f4SLouis Dionne //===----------------------------------------------------------------------===// 8*0e34f3f4SLouis Dionne 9*0e34f3f4SLouis Dionne #ifndef _LIBCPP___ATOMIC_SUPPORT_C11_H 10*0e34f3f4SLouis Dionne #define _LIBCPP___ATOMIC_SUPPORT_C11_H 11*0e34f3f4SLouis Dionne 12*0e34f3f4SLouis Dionne #include <__atomic/memory_order.h> 13*0e34f3f4SLouis Dionne #include <__config> 14*0e34f3f4SLouis Dionne #include <__cstddef/ptrdiff_t.h> 15*0e34f3f4SLouis Dionne #include <__memory/addressof.h> 16*0e34f3f4SLouis Dionne #include <__type_traits/remove_const.h> 17*0e34f3f4SLouis Dionne 18*0e34f3f4SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19*0e34f3f4SLouis Dionne # pragma GCC system_header 20*0e34f3f4SLouis Dionne #endif 21*0e34f3f4SLouis Dionne 22*0e34f3f4SLouis Dionne // 23*0e34f3f4SLouis Dionne // This file implements support for C11-style atomics 24*0e34f3f4SLouis Dionne // 25*0e34f3f4SLouis Dionne 26*0e34f3f4SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 27*0e34f3f4SLouis Dionne 28*0e34f3f4SLouis Dionne template <typename _Tp> 29*0e34f3f4SLouis Dionne struct __cxx_atomic_base_impl { 30*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI 31*0e34f3f4SLouis Dionne #ifndef _LIBCPP_CXX03_LANG 32*0e34f3f4SLouis Dionne __cxx_atomic_base_impl() _NOEXCEPT = default; 33*0e34f3f4SLouis Dionne #else 34*0e34f3f4SLouis Dionne __cxx_atomic_base_impl() _NOEXCEPT : __a_value() { 35*0e34f3f4SLouis Dionne } 36*0e34f3f4SLouis Dionne #endif // _LIBCPP_CXX03_LANG 37*0e34f3f4SLouis Dionne _LIBCPP_CONSTEXPR explicit __cxx_atomic_base_impl(_Tp __value) _NOEXCEPT : __a_value(__value) {} 38*0e34f3f4SLouis Dionne _LIBCPP_DISABLE_EXTENSION_WARNING _Atomic(_Tp) __a_value; 39*0e34f3f4SLouis Dionne }; 40*0e34f3f4SLouis Dionne 41*0e34f3f4SLouis Dionne #define __cxx_atomic_is_lock_free(__s) __c11_atomic_is_lock_free(__s) 42*0e34f3f4SLouis Dionne 43*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_thread_fence(memory_order __order) _NOEXCEPT { 44*0e34f3f4SLouis Dionne __c11_atomic_thread_fence(static_cast<__memory_order_underlying_t>(__order)); 45*0e34f3f4SLouis Dionne } 46*0e34f3f4SLouis Dionne 47*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline void __cxx_atomic_signal_fence(memory_order __order) _NOEXCEPT { 48*0e34f3f4SLouis Dionne __c11_atomic_signal_fence(static_cast<__memory_order_underlying_t>(__order)); 49*0e34f3f4SLouis Dionne } 50*0e34f3f4SLouis Dionne 51*0e34f3f4SLouis Dionne template <class _Tp> 52*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val) _NOEXCEPT { 53*0e34f3f4SLouis Dionne __c11_atomic_init(std::addressof(__a->__a_value), __val); 54*0e34f3f4SLouis Dionne } 55*0e34f3f4SLouis Dionne template <class _Tp> 56*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void __cxx_atomic_init(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val) _NOEXCEPT { 57*0e34f3f4SLouis Dionne __c11_atomic_init(std::addressof(__a->__a_value), __val); 58*0e34f3f4SLouis Dionne } 59*0e34f3f4SLouis Dionne 60*0e34f3f4SLouis Dionne template <class _Tp> 61*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void 62*0e34f3f4SLouis Dionne __cxx_atomic_store(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __val, memory_order __order) _NOEXCEPT { 63*0e34f3f4SLouis Dionne __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order)); 64*0e34f3f4SLouis Dionne } 65*0e34f3f4SLouis Dionne template <class _Tp> 66*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void 67*0e34f3f4SLouis Dionne __cxx_atomic_store(__cxx_atomic_base_impl<_Tp>* __a, _Tp __val, memory_order __order) _NOEXCEPT { 68*0e34f3f4SLouis Dionne __c11_atomic_store(std::addressof(__a->__a_value), __val, static_cast<__memory_order_underlying_t>(__order)); 69*0e34f3f4SLouis Dionne } 70*0e34f3f4SLouis Dionne 71*0e34f3f4SLouis Dionne template <class _Tp> 72*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 73*0e34f3f4SLouis Dionne __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const volatile* __a, memory_order __order) _NOEXCEPT { 74*0e34f3f4SLouis Dionne using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*; 75*0e34f3f4SLouis Dionne return __c11_atomic_load( 76*0e34f3f4SLouis Dionne const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order)); 77*0e34f3f4SLouis Dionne } 78*0e34f3f4SLouis Dionne template <class _Tp> 79*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp __cxx_atomic_load(__cxx_atomic_base_impl<_Tp> const* __a, memory_order __order) _NOEXCEPT { 80*0e34f3f4SLouis Dionne using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*; 81*0e34f3f4SLouis Dionne return __c11_atomic_load( 82*0e34f3f4SLouis Dionne const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order)); 83*0e34f3f4SLouis Dionne } 84*0e34f3f4SLouis Dionne 85*0e34f3f4SLouis Dionne template <class _Tp> 86*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void 87*0e34f3f4SLouis Dionne __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const volatile* __a, _Tp* __dst, memory_order __order) _NOEXCEPT { 88*0e34f3f4SLouis Dionne using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*; 89*0e34f3f4SLouis Dionne *__dst = __c11_atomic_load( 90*0e34f3f4SLouis Dionne const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order)); 91*0e34f3f4SLouis Dionne } 92*0e34f3f4SLouis Dionne template <class _Tp> 93*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI void 94*0e34f3f4SLouis Dionne __cxx_atomic_load_inplace(__cxx_atomic_base_impl<_Tp> const* __a, _Tp* __dst, memory_order __order) _NOEXCEPT { 95*0e34f3f4SLouis Dionne using __ptr_type = __remove_const_t<decltype(__a->__a_value)>*; 96*0e34f3f4SLouis Dionne *__dst = __c11_atomic_load( 97*0e34f3f4SLouis Dionne const_cast<__ptr_type>(std::addressof(__a->__a_value)), static_cast<__memory_order_underlying_t>(__order)); 98*0e34f3f4SLouis Dionne } 99*0e34f3f4SLouis Dionne 100*0e34f3f4SLouis Dionne template <class _Tp> 101*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 102*0e34f3f4SLouis Dionne __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __value, memory_order __order) _NOEXCEPT { 103*0e34f3f4SLouis Dionne return __c11_atomic_exchange( 104*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order)); 105*0e34f3f4SLouis Dionne } 106*0e34f3f4SLouis Dionne template <class _Tp> 107*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 108*0e34f3f4SLouis Dionne __cxx_atomic_exchange(__cxx_atomic_base_impl<_Tp>* __a, _Tp __value, memory_order __order) _NOEXCEPT { 109*0e34f3f4SLouis Dionne return __c11_atomic_exchange( 110*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __value, static_cast<__memory_order_underlying_t>(__order)); 111*0e34f3f4SLouis Dionne } 112*0e34f3f4SLouis Dionne 113*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR memory_order __to_failure_order(memory_order __order) { 114*0e34f3f4SLouis Dionne // Avoid switch statement to make this a constexpr. 115*0e34f3f4SLouis Dionne return __order == memory_order_release 116*0e34f3f4SLouis Dionne ? memory_order_relaxed 117*0e34f3f4SLouis Dionne : (__order == memory_order_acq_rel ? memory_order_acquire : __order); 118*0e34f3f4SLouis Dionne } 119*0e34f3f4SLouis Dionne 120*0e34f3f4SLouis Dionne template <class _Tp> 121*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong( 122*0e34f3f4SLouis Dionne __cxx_atomic_base_impl<_Tp> volatile* __a, 123*0e34f3f4SLouis Dionne _Tp* __expected, 124*0e34f3f4SLouis Dionne _Tp __value, 125*0e34f3f4SLouis Dionne memory_order __success, 126*0e34f3f4SLouis Dionne memory_order __failure) _NOEXCEPT { 127*0e34f3f4SLouis Dionne return __c11_atomic_compare_exchange_strong( 128*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), 129*0e34f3f4SLouis Dionne __expected, 130*0e34f3f4SLouis Dionne __value, 131*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__success), 132*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__to_failure_order(__failure))); 133*0e34f3f4SLouis Dionne } 134*0e34f3f4SLouis Dionne template <class _Tp> 135*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_strong( 136*0e34f3f4SLouis Dionne __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) 137*0e34f3f4SLouis Dionne _NOEXCEPT { 138*0e34f3f4SLouis Dionne return __c11_atomic_compare_exchange_strong( 139*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), 140*0e34f3f4SLouis Dionne __expected, 141*0e34f3f4SLouis Dionne __value, 142*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__success), 143*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__to_failure_order(__failure))); 144*0e34f3f4SLouis Dionne } 145*0e34f3f4SLouis Dionne 146*0e34f3f4SLouis Dionne template <class _Tp> 147*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak( 148*0e34f3f4SLouis Dionne __cxx_atomic_base_impl<_Tp> volatile* __a, 149*0e34f3f4SLouis Dionne _Tp* __expected, 150*0e34f3f4SLouis Dionne _Tp __value, 151*0e34f3f4SLouis Dionne memory_order __success, 152*0e34f3f4SLouis Dionne memory_order __failure) _NOEXCEPT { 153*0e34f3f4SLouis Dionne return __c11_atomic_compare_exchange_weak( 154*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), 155*0e34f3f4SLouis Dionne __expected, 156*0e34f3f4SLouis Dionne __value, 157*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__success), 158*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__to_failure_order(__failure))); 159*0e34f3f4SLouis Dionne } 160*0e34f3f4SLouis Dionne template <class _Tp> 161*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI bool __cxx_atomic_compare_exchange_weak( 162*0e34f3f4SLouis Dionne __cxx_atomic_base_impl<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) 163*0e34f3f4SLouis Dionne _NOEXCEPT { 164*0e34f3f4SLouis Dionne return __c11_atomic_compare_exchange_weak( 165*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), 166*0e34f3f4SLouis Dionne __expected, 167*0e34f3f4SLouis Dionne __value, 168*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__success), 169*0e34f3f4SLouis Dionne static_cast<__memory_order_underlying_t>(__to_failure_order(__failure))); 170*0e34f3f4SLouis Dionne } 171*0e34f3f4SLouis Dionne 172*0e34f3f4SLouis Dionne template <class _Tp> 173*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 174*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT { 175*0e34f3f4SLouis Dionne return __c11_atomic_fetch_add( 176*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 177*0e34f3f4SLouis Dionne } 178*0e34f3f4SLouis Dionne template <class _Tp> 179*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 180*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT { 181*0e34f3f4SLouis Dionne return __c11_atomic_fetch_add( 182*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 183*0e34f3f4SLouis Dionne } 184*0e34f3f4SLouis Dionne 185*0e34f3f4SLouis Dionne template <class _Tp> 186*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp* 187*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT { 188*0e34f3f4SLouis Dionne return __c11_atomic_fetch_add( 189*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 190*0e34f3f4SLouis Dionne } 191*0e34f3f4SLouis Dionne template <class _Tp> 192*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp* 193*0e34f3f4SLouis Dionne __cxx_atomic_fetch_add(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT { 194*0e34f3f4SLouis Dionne return __c11_atomic_fetch_add( 195*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 196*0e34f3f4SLouis Dionne } 197*0e34f3f4SLouis Dionne 198*0e34f3f4SLouis Dionne template <class _Tp> 199*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 200*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __delta, memory_order __order) _NOEXCEPT { 201*0e34f3f4SLouis Dionne return __c11_atomic_fetch_sub( 202*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 203*0e34f3f4SLouis Dionne } 204*0e34f3f4SLouis Dionne template <class _Tp> 205*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 206*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp>* __a, _Tp __delta, memory_order __order) _NOEXCEPT { 207*0e34f3f4SLouis Dionne return __c11_atomic_fetch_sub( 208*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 209*0e34f3f4SLouis Dionne } 210*0e34f3f4SLouis Dionne template <class _Tp> 211*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp* 212*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT { 213*0e34f3f4SLouis Dionne return __c11_atomic_fetch_sub( 214*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 215*0e34f3f4SLouis Dionne } 216*0e34f3f4SLouis Dionne template <class _Tp> 217*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp* 218*0e34f3f4SLouis Dionne __cxx_atomic_fetch_sub(__cxx_atomic_base_impl<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) _NOEXCEPT { 219*0e34f3f4SLouis Dionne return __c11_atomic_fetch_sub( 220*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __delta, static_cast<__memory_order_underlying_t>(__order)); 221*0e34f3f4SLouis Dionne } 222*0e34f3f4SLouis Dionne 223*0e34f3f4SLouis Dionne template <class _Tp> 224*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 225*0e34f3f4SLouis Dionne __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 226*0e34f3f4SLouis Dionne return __c11_atomic_fetch_and( 227*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 228*0e34f3f4SLouis Dionne } 229*0e34f3f4SLouis Dionne template <class _Tp> 230*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 231*0e34f3f4SLouis Dionne __cxx_atomic_fetch_and(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 232*0e34f3f4SLouis Dionne return __c11_atomic_fetch_and( 233*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 234*0e34f3f4SLouis Dionne } 235*0e34f3f4SLouis Dionne 236*0e34f3f4SLouis Dionne template <class _Tp> 237*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 238*0e34f3f4SLouis Dionne __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 239*0e34f3f4SLouis Dionne return __c11_atomic_fetch_or( 240*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 241*0e34f3f4SLouis Dionne } 242*0e34f3f4SLouis Dionne template <class _Tp> 243*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 244*0e34f3f4SLouis Dionne __cxx_atomic_fetch_or(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 245*0e34f3f4SLouis Dionne return __c11_atomic_fetch_or( 246*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 247*0e34f3f4SLouis Dionne } 248*0e34f3f4SLouis Dionne 249*0e34f3f4SLouis Dionne template <class _Tp> 250*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 251*0e34f3f4SLouis Dionne __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp> volatile* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 252*0e34f3f4SLouis Dionne return __c11_atomic_fetch_xor( 253*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 254*0e34f3f4SLouis Dionne } 255*0e34f3f4SLouis Dionne template <class _Tp> 256*0e34f3f4SLouis Dionne _LIBCPP_HIDE_FROM_ABI _Tp 257*0e34f3f4SLouis Dionne __cxx_atomic_fetch_xor(__cxx_atomic_base_impl<_Tp>* __a, _Tp __pattern, memory_order __order) _NOEXCEPT { 258*0e34f3f4SLouis Dionne return __c11_atomic_fetch_xor( 259*0e34f3f4SLouis Dionne std::addressof(__a->__a_value), __pattern, static_cast<__memory_order_underlying_t>(__order)); 260*0e34f3f4SLouis Dionne } 261*0e34f3f4SLouis Dionne 262*0e34f3f4SLouis Dionne _LIBCPP_END_NAMESPACE_STD 263*0e34f3f4SLouis Dionne 264*0e34f3f4SLouis Dionne #endif // _LIBCPP___ATOMIC_SUPPORT_C11_H 265