in source/linux/io_uring_context.cpp [695:766]
void io_uring_context::update_timers() noexcept {
LOG("update_timers()");
// Reap any elapsed timers.
if (!timers_.empty()) {
time_point now = monotonic_clock::now();
while (!timers_.empty() && timers_.top()->dueTime_ <= now) {
schedule_at_operation* item = timers_.pop();
LOGX("dequeued elapsed timer %p\n", (void*)item);
if (item->canBeCancelled_) {
auto oldState = item->state_.fetch_add(
schedule_at_operation::timer_elapsed_flag,
std::memory_order_acq_rel);
if ((oldState & schedule_at_operation::cancel_pending_flag) != 0) {
LOGX("timer already cancelled\n");
// Timer has been cancelled by a remote thread.
// The other thread is responsible for enqueueing is operation onto
// the remoteQueue_.
continue;
}
}
// Otherwise, we are responsible for enqueuing the timer onto the
// ready-to-run queue.
schedule_local(item);
}
}
// Check if we need to cancel or start some new OS timers.
if (timers_.empty()) {
if (currentDueTime_.has_value()) {
LOG("no more schedule_at requests, cancelling timer");
// Cancel the outstanding timer.
if (try_submit_timer_io_cancel()) {
currentDueTime_.reset();
timersAreDirty_ = false;
}
}
} else {
const auto earliestDueTime = timers_.top()->dueTime_;
if (currentDueTime_) {
constexpr auto threshold = std::chrono::microseconds(1);
if (earliestDueTime < (*currentDueTime_ - threshold)) {
LOG("active timer, need to cancel and submit an earlier one");
// An earlier time has been scheduled.
// Cancel the old timer before submitting a new one.
if (try_submit_timer_io_cancel()) {
currentDueTime_.reset();
if (try_submit_timer_io(earliestDueTime)) {
currentDueTime_ = earliestDueTime;
timersAreDirty_ = false;
}
}
} else {
timersAreDirty_ = false;
}
} else {
// No active timer, submit a new timer
LOG("no active timer, trying to submit a new one");
if (try_submit_timer_io(earliestDueTime)) {
currentDueTime_ = earliestDueTime;
timersAreDirty_ = false;
}
}
}
}