25#ifndef JOIN_CORE_BACKOFF_HPP
26#define JOIN_CORE_BACKOFF_HPP
36#if defined(__x86_64__) || defined(__i386__)
55 explicit Backoff (std::chrono::nanoseconds spin = std::chrono::microseconds (10),
56 std::chrono::nanoseconds yield = std::chrono::microseconds (100),
57 std::chrono::nanoseconds sleep = std::chrono::microseconds (50)) noexcept
78#if defined(__x86_64__) || defined(__i386__)
80#elif defined(__aarch64__) || defined(__arm__)
81 __asm__ __volatile__ (
"isb" :::
"memory");
91 if ((_sleep == std::chrono::nanoseconds::zero ()) || (elapsed - _spin < _yield))
93 std::this_thread::yield ();
97 std::this_thread::sleep_for (_sleep);
121 std::chrono::nanoseconds _spin;
124 std::chrono::nanoseconds _yield;
127 std::chrono::nanoseconds _sleep;
133 bool _spinning =
true;
adaptive backoff for busy-wait loops, requires Rdtsc::calibrate ().
Definition backoff.hpp:47
void reset() noexcept
reset backoff to initial state.
Definition backoff.hpp:104
Backoff(std::chrono::nanoseconds spin=std::chrono::microseconds(10), std::chrono::nanoseconds yield=std::chrono::microseconds(100), std::chrono::nanoseconds sleep=std::chrono::microseconds(50)) noexcept
construct a backoff strategy.
Definition backoff.hpp:55
void operator()() noexcept
execute one backoff iteration.
Definition backoff.hpp:67
bool spinExhausted() const noexcept
check if initial spin phase is over.
Definition backoff.hpp:114
std::chrono::time_point< NanoClock > TimePoint
Definition clock.hpp:187
static TimePoint now() noexcept
read the current time, requires calibrate ().
Definition clock.hpp:266
Definition acceptor.hpp:32