use super::{Duration, EntryState, Instant, PendingReplyTable, TimerRef};
impl PendingReplyTable {
pub(in crate::server::connection) fn timers_to_arm(
&self,
now: Instant,
) -> Vec<(u64, Duration)> {
self.entries
.iter()
.filter(|entry| entry.state == EntryState::Pending && entry.timer.is_none())
.map(|entry| (entry.op_id, entry.deadline.saturating_duration_since(now)))
.collect()
}
pub(in crate::server::connection) fn install_timer(
&mut self,
op_id: u64,
timer: TimerRef,
) -> bool {
let Some(entry) = self.entries.iter_mut().find(|entry| entry.op_id == op_id) else {
return false;
};
if entry.state != EntryState::Pending || entry.timer.is_some() {
return false;
}
entry.timer = Some(timer);
true
}
pub(in crate::server::connection) fn take_retired_timers(&mut self) -> Vec<TimerRef> {
std::mem::take(&mut self.retired_timers)
}
pub(in crate::server::connection) fn has_due(&self, now: Instant) -> bool {
self.entries
.iter()
.any(|entry| entry.state == EntryState::Pending && entry.deadline <= now)
}
pub(super) fn retire_timer(&mut self, timer: Option<TimerRef>) {
if let Some(timer) = timer {
self.retired_timers.push(timer);
}
}
}