Path: blob/main/contrib/llvm-project/libcxx/include/__atomic/atomic_flag.h
35262 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_ATOMIC_FLAG_H9#define _LIBCPP___ATOMIC_ATOMIC_FLAG_H1011#include <__atomic/atomic_sync.h>12#include <__atomic/contention_t.h>13#include <__atomic/cxx_atomic_impl.h>14#include <__atomic/memory_order.h>15#include <__chrono/duration.h>16#include <__config>17#include <__memory/addressof.h>18#include <__thread/support.h>19#include <cstdint>2021#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)22# pragma GCC system_header23#endif2425_LIBCPP_BEGIN_NAMESPACE_STD2627struct atomic_flag {28__cxx_atomic_impl<_LIBCPP_ATOMIC_FLAG_TYPE> __a_;2930_LIBCPP_HIDE_FROM_ABI bool test(memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT {31return _LIBCPP_ATOMIC_FLAG_TYPE(true) == __cxx_atomic_load(&__a_, __m);32}33_LIBCPP_HIDE_FROM_ABI bool test(memory_order __m = memory_order_seq_cst) const _NOEXCEPT {34return _LIBCPP_ATOMIC_FLAG_TYPE(true) == __cxx_atomic_load(&__a_, __m);35}3637_LIBCPP_HIDE_FROM_ABI bool test_and_set(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {38return __cxx_atomic_exchange(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(true), __m);39}40_LIBCPP_HIDE_FROM_ABI bool test_and_set(memory_order __m = memory_order_seq_cst) _NOEXCEPT {41return __cxx_atomic_exchange(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(true), __m);42}43_LIBCPP_HIDE_FROM_ABI void clear(memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {44__cxx_atomic_store(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(false), __m);45}46_LIBCPP_HIDE_FROM_ABI void clear(memory_order __m = memory_order_seq_cst) _NOEXCEPT {47__cxx_atomic_store(&__a_, _LIBCPP_ATOMIC_FLAG_TYPE(false), __m);48}4950_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void51wait(bool __v, memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT {52std::__atomic_wait(*this, _LIBCPP_ATOMIC_FLAG_TYPE(__v), __m);53}54_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void55wait(bool __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT {56std::__atomic_wait(*this, _LIBCPP_ATOMIC_FLAG_TYPE(__v), __m);57}58_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() volatile _NOEXCEPT {59std::__atomic_notify_one(*this);60}61_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one() _NOEXCEPT {62std::__atomic_notify_one(*this);63}64_LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() volatile _NOEXCEPT {65std::__atomic_notify_all(*this);66}67_LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all() _NOEXCEPT {68std::__atomic_notify_all(*this);69}7071#if _LIBCPP_STD_VER >= 2072_LIBCPP_HIDE_FROM_ABI constexpr atomic_flag() _NOEXCEPT : __a_(false) {}73#else74atomic_flag() _NOEXCEPT = default;75#endif7677_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR atomic_flag(bool __b) _NOEXCEPT : __a_(__b) {} // EXTENSION7879atomic_flag(const atomic_flag&) = delete;80atomic_flag& operator=(const atomic_flag&) = delete;81atomic_flag& operator=(const atomic_flag&) volatile = delete;82};8384template <>85struct __atomic_waitable_traits<atomic_flag> {86static _LIBCPP_HIDE_FROM_ABI _LIBCPP_ATOMIC_FLAG_TYPE __atomic_load(const atomic_flag& __a, memory_order __order) {87return std::__cxx_atomic_load(&__a.__a_, __order);88}8990static _LIBCPP_HIDE_FROM_ABI _LIBCPP_ATOMIC_FLAG_TYPE91__atomic_load(const volatile atomic_flag& __a, memory_order __order) {92return std::__cxx_atomic_load(&__a.__a_, __order);93}9495static _LIBCPP_HIDE_FROM_ABI const __cxx_atomic_impl<_LIBCPP_ATOMIC_FLAG_TYPE>*96__atomic_contention_address(const atomic_flag& __a) {97return std::addressof(__a.__a_);98}99100static _LIBCPP_HIDE_FROM_ABI const volatile __cxx_atomic_impl<_LIBCPP_ATOMIC_FLAG_TYPE>*101__atomic_contention_address(const volatile atomic_flag& __a) {102return std::addressof(__a.__a_);103}104};105106inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test(const volatile atomic_flag* __o) _NOEXCEPT { return __o->test(); }107108inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test(const atomic_flag* __o) _NOEXCEPT { return __o->test(); }109110inline _LIBCPP_HIDE_FROM_ABI bool111atomic_flag_test_explicit(const volatile atomic_flag* __o, memory_order __m) _NOEXCEPT {112return __o->test(__m);113}114115inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test_explicit(const atomic_flag* __o, memory_order __m) _NOEXCEPT {116return __o->test(__m);117}118119inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test_and_set(volatile atomic_flag* __o) _NOEXCEPT {120return __o->test_and_set();121}122123inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test_and_set(atomic_flag* __o) _NOEXCEPT { return __o->test_and_set(); }124125inline _LIBCPP_HIDE_FROM_ABI bool126atomic_flag_test_and_set_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT {127return __o->test_and_set(__m);128}129130inline _LIBCPP_HIDE_FROM_ABI bool atomic_flag_test_and_set_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT {131return __o->test_and_set(__m);132}133134inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_clear(volatile atomic_flag* __o) _NOEXCEPT { __o->clear(); }135136inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_clear(atomic_flag* __o) _NOEXCEPT { __o->clear(); }137138inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_clear_explicit(volatile atomic_flag* __o, memory_order __m) _NOEXCEPT {139__o->clear(__m);140}141142inline _LIBCPP_HIDE_FROM_ABI void atomic_flag_clear_explicit(atomic_flag* __o, memory_order __m) _NOEXCEPT {143__o->clear(__m);144}145146inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void147atomic_flag_wait(const volatile atomic_flag* __o, bool __v) _NOEXCEPT {148__o->wait(__v);149}150151inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void152atomic_flag_wait(const atomic_flag* __o, bool __v) _NOEXCEPT {153__o->wait(__v);154}155156inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void157atomic_flag_wait_explicit(const volatile atomic_flag* __o, bool __v, memory_order __m) _NOEXCEPT {158__o->wait(__v, __m);159}160161inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void162atomic_flag_wait_explicit(const atomic_flag* __o, bool __v, memory_order __m) _NOEXCEPT {163__o->wait(__v, __m);164}165166inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void167atomic_flag_notify_one(volatile atomic_flag* __o) _NOEXCEPT {168__o->notify_one();169}170171inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void172atomic_flag_notify_one(atomic_flag* __o) _NOEXCEPT {173__o->notify_one();174}175176inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void177atomic_flag_notify_all(volatile atomic_flag* __o) _NOEXCEPT {178__o->notify_all();179}180181inline _LIBCPP_DEPRECATED_ATOMIC_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_SYNC void182atomic_flag_notify_all(atomic_flag* __o) _NOEXCEPT {183__o->notify_all();184}185186_LIBCPP_END_NAMESPACE_STD187188#endif // _LIBCPP___ATOMIC_ATOMIC_FLAG_H189190191