core: block instead of yield-spinning in the timer queue dispatch thread

This commit is contained in:
mchughalex 2026-07-21 11:35:49 +01:00
parent 3e842e62a6
commit f8da2d0900
2 changed files with 14 additions and 8 deletions

View file

@ -12,10 +12,10 @@
#include <algorithm>
#include <forward_list>
#include <disruptorplus/blocking_wait_strategy.hpp>
#include <disruptorplus/multi_threaded_claim_strategy.hpp>
#include <disruptorplus/ring_buffer.hpp>
#include <disruptorplus/sequence_barrier.hpp>
#include <disruptorplus/spin_wait_strategy.hpp>
#include <rex/assert.h>
#include <rex/thread.h>
@ -142,9 +142,15 @@ class TimerQueue {
// This ring buffer will be used to introduce timers queued by the public API
static constexpr size_t kWaitCount = 512;
dp::ring_buffer<std::shared_ptr<WaitItem>> buffer_;
dp::spin_wait_strategy wait_strategy_;
dp::multi_threaded_claim_strategy<dp::spin_wait_strategy> claim_strategy_;
dp::sequence_barrier<dp::spin_wait_strategy> consumed_;
// Blocking (condition-variable) waits, not the spin strategy: the dispatch
// thread waits with a deadline of the next timer due time, and with a spin
// strategy that wait yield-spins for the whole interval, permanently
// burning most of a core while any guest timer is pending. Guest timers
// need millisecond-class dispatch precision, which a condition variable
// delivers comfortably.
dp::blocking_wait_strategy wait_strategy_;
dp::multi_threaded_claim_strategy<dp::blocking_wait_strategy> claim_strategy_;
dp::sequence_barrier<dp::blocking_wait_strategy> consumed_;
// This is a _sorted_ (ascending due_) list of active timers managed by a
// dedicated thread

View file

@ -118,11 +118,11 @@ namespace disruptorplus
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait_for(
lock,
timeout,
[&]() -> bool {
result = minimum_sequence_after(sequence, count, sequences);
return difference(result, sequence) >= 0;
},
timeout);
});
}
return result;
}
@ -171,11 +171,11 @@ namespace disruptorplus
std::unique_lock<std::mutex> lock(m_mutex);
m_cv.wait_until(
lock,
timeoutTime,
[&]() -> bool {
result = minimum_sequence_after(sequence, count, sequences);
return difference(result, sequence) >= 0;
},
timeoutTime);
});
}
return result;
}