Path: blob/main/contrib/llvm-project/libcxx/include/__atomic/support.h
213766 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___ATOMIC_SUPPORT_H9#define _LIBCPP___ATOMIC_SUPPORT_H1011#include <__config>1213#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)14# pragma GCC system_header15#endif1617//18// This file implements base support for atomics on the platform.19//20// The following operations and types must be implemented (where _Atmc21// is __cxx_atomic_base_impl for readability):22//23// clang-format off24//25// template <class _Tp>26// struct __cxx_atomic_base_impl;27//28// #define __cxx_atomic_is_lock_free(__size)29//30// void __cxx_atomic_thread_fence(memory_order __order) noexcept;31// void __cxx_atomic_signal_fence(memory_order __order) noexcept;32//33// template <class _Tp>34// void __cxx_atomic_init(_Atmc<_Tp> volatile* __a, _Tp __val) noexcept;35// template <class _Tp>36// void __cxx_atomic_init(_Atmc<_Tp>* __a, _Tp __val) noexcept;37//38// template <class _Tp>39// void __cxx_atomic_store(_Atmc<_Tp> volatile* __a, _Tp __val, memory_order __order) noexcept;40// template <class _Tp>41// void __cxx_atomic_store(_Atmc<_Tp>* __a, _Tp __val, memory_order __order) noexcept;42//43// template <class _Tp>44// _Tp __cxx_atomic_load(_Atmc<_Tp> const volatile* __a, memory_order __order) noexcept;45// template <class _Tp>46// _Tp __cxx_atomic_load(_Atmc<_Tp> const* __a, memory_order __order) noexcept;47//48// template <class _Tp>49// void __cxx_atomic_load_inplace(_Atmc<_Tp> const volatile* __a, _Tp* __dst, memory_order __order) noexcept;50// template <class _Tp>51// void __cxx_atomic_load_inplace(_Atmc<_Tp> const* __a, _Tp* __dst, memory_order __order) noexcept;52//53// template <class _Tp>54// _Tp __cxx_atomic_exchange(_Atmc<_Tp> volatile* __a, _Tp __value, memory_order __order) noexcept;55// template <class _Tp>56// _Tp __cxx_atomic_exchange(_Atmc<_Tp>* __a, _Tp __value, memory_order __order) noexcept;57//58// template <class _Tp>59// bool __cxx_atomic_compare_exchange_strong(_Atmc<_Tp> volatile* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) noexcept;60// template <class _Tp>61// bool __cxx_atomic_compare_exchange_strong(_Atmc<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) noexcept;62//63// template <class _Tp>64// bool __cxx_atomic_compare_exchange_weak(_Atmc<_Tp> volatile* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) noexcept;65// template <class _Tp>66// bool __cxx_atomic_compare_exchange_weak(_Atmc<_Tp>* __a, _Tp* __expected, _Tp __value, memory_order __success, memory_order __failure) noexcept;67//68// template <class _Tp>69// _Tp __cxx_atomic_fetch_add(_Atmc<_Tp> volatile* __a, _Tp __delta, memory_order __order) noexcept;70// template <class _Tp>71// _Tp __cxx_atomic_fetch_add(_Atmc<_Tp>* __a, _Tp __delta, memory_order __order) noexcept;72//73// template <class _Tp>74// _Tp* __cxx_atomic_fetch_add(_Atmc<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) noexcept;75// template <class _Tp>76// _Tp* __cxx_atomic_fetch_add(_Atmc<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) noexcept;77//78// template <class _Tp>79// _Tp __cxx_atomic_fetch_sub(_Atmc<_Tp> volatile* __a, _Tp __delta, memory_order __order) noexcept;80// template <class _Tp>81// _Tp __cxx_atomic_fetch_sub(_Atmc<_Tp>* __a, _Tp __delta, memory_order __order) noexcept;82// template <class _Tp>83// _Tp* __cxx_atomic_fetch_sub(_Atmc<_Tp*> volatile* __a, ptrdiff_t __delta, memory_order __order) noexcept;84// template <class _Tp>85// _Tp* __cxx_atomic_fetch_sub(_Atmc<_Tp*>* __a, ptrdiff_t __delta, memory_order __order) noexcept;86//87// template <class _Tp>88// _Tp __cxx_atomic_fetch_and(_Atmc<_Tp> volatile* __a, _Tp __pattern, memory_order __order) noexcept;89// template <class _Tp>90// _Tp __cxx_atomic_fetch_and(_Atmc<_Tp>* __a, _Tp __pattern, memory_order __order) noexcept;91//92// template <class _Tp>93// _Tp __cxx_atomic_fetch_or(_Atmc<_Tp> volatile* __a, _Tp __pattern, memory_order __order) noexcept;94// template <class _Tp>95// _Tp __cxx_atomic_fetch_or(_Atmc<_Tp>* __a, _Tp __pattern, memory_order __order) noexcept;96// template <class _Tp>97// _Tp __cxx_atomic_fetch_xor(_Atmc<_Tp> volatile* __a, _Tp __pattern, memory_order __order) noexcept;98// template <class _Tp>99// _Tp __cxx_atomic_fetch_xor(_Atmc<_Tp>* __a, _Tp __pattern, memory_order __order) noexcept;100//101// clang-format on102//103104#if _LIBCPP_HAS_GCC_ATOMIC_IMP105# include <__atomic/support/gcc.h>106#elif _LIBCPP_HAS_C_ATOMIC_IMP107# include <__atomic/support/c11.h>108#endif109110_LIBCPP_BEGIN_NAMESPACE_STD111112template <typename _Tp, typename _Base = __cxx_atomic_base_impl<_Tp> >113struct __cxx_atomic_impl : public _Base {114_LIBCPP_HIDE_FROM_ABI __cxx_atomic_impl() _NOEXCEPT = default;115_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit __cxx_atomic_impl(_Tp __value) _NOEXCEPT : _Base(__value) {}116};117118_LIBCPP_END_NAMESPACE_STD119120#endif // _LIBCPP___ATOMIC_SUPPORT_H121122123