8#include "os_detect.hpp"
24template<basic_fixed_
string CounterTag,
typename T>
26contended_wait_for_transition(
std::atomic<T> const &state, T to, std::memory_order order = std::memory_order_seq_cst)
28 using namespace std::literals::chrono_literals;
30 increment_counter<CounterTag>();
34 if (state.
load(order) == to) {
39 if ((backoff *= 2) > 1s) {
56template<basic_fixed_
string CounterTag,
typename T>
57void wait_for_transition(
std::atomic<T> const &state, T to, std::memory_order order = std::memory_order_seq_cst)
59 if (state.
load(order) != to) {
60 [[unlikely]] contended_wait_for_transition<CounterTag>(state, to, order);
72template<basic_fixed_string BlockCounterTag =
"",
typename T>
73tt_no_inline
void contended_transition(
std::atomic<T> &state, T from, T to, std::memory_order order = std::memory_order_seq_cst)
75 using namespace std::literals::chrono_literals;
77 if constexpr (BlockCounterTag !=
"") {
78 increment_counter<BlockCounterTag>();
89 if ((backoff *= 2) > 1s) {
104template<basic_fixed_string BlockCounterTag =
"",
typename T>
105void transition(
std::atomic<T> &state, T from, T to, std::memory_order order = std::memory_order_seq_cst)
111 return contended_transition<BlockCounterTag>(state, from, to, order);
T compare_exchange_weak(T... args)