38 #ifndef LIBPMEMOBJ_ATOMIC_BACKOFF_HPP
39 #define LIBPMEMOBJ_ATOMIC_BACKOFF_HPP
53 class atomic_backoff {
59 static const int32_t LOOPS_BEFORE_YIELD = 16;
63 __pause(int32_t delay)
65 for (; delay > 0; --delay) {
68 #elif __GNUC__ && (__i386__ || __x86_64__)
70 __builtin_ia32_pause();
79 atomic_backoff(
const atomic_backoff &) =
delete;
83 atomic_backoff &operator=(
const atomic_backoff &) =
delete;
89 atomic_backoff() : count(1)
96 atomic_backoff(
bool) : count(1)
107 if (count <= LOOPS_BEFORE_YIELD) {
114 std::this_thread::yield();
125 if (count < LOOPS_BEFORE_YIELD) {