6#include "TTauri/Foundation/counters.hpp"
7#include "TTauri/Foundation/string_tag.hpp"
8#include "TTauri/Foundation/os_detect.hpp"
23template<
typename CounterTag,
typename T>
24tt_no_inline
void contended_wait_for_transition(
std::atomic<T> const &state, T to, std::memory_order order=std::memory_order_seq_cst)
26 using namespace std::literals::chrono_literals;
28 increment_counter<CounterTag>();
32 if (state.
load(order) == to) {
37 if ((backoff *= 2) > 1s) {
52template<
typename CounterTag,
typename T>
53tt_force_inline
void wait_for_transition(
std::atomic<T> const &state, T to, std::memory_order order=std::memory_order_seq_cst)
55 if (tt_unlikely(state.
load(order) != to)) {
56 contended_wait_for_transition<CounterTag>(state, to, order);
68template<
string_tag BlockCounterTag=0,
typename T>
69tt_no_inline
void contended_transition(
std::atomic<T> &state, T from, T to, std::memory_order order=std::memory_order_seq_cst)
71 using namespace std::literals::chrono_literals;
73 if constexpr (BlockCounterTag != 0) {
74 increment_counter<BlockCounterTag>();
85 if ((backoff *= 2) > 1s) {
100template<
string_tag BlockCounterTag=0,
typename T>
101tt_force_inline
void transition(
std::atomic<T> &state, T from, T to, std::memory_order order=std::memory_order_seq_cst)
107 return contended_transition<BlockCounterTag>(state, from, to, order);
T compare_exchange_weak(T... args)