Skip to content

Commit c0164a9

Browse files
authored
fix(runtime): incorrect min_timeout (#246)
* fix(runtime): incorrect min_timeout * refactor(runtime): use Reverse in BinaryHeap
1 parent 925460c commit c0164a9

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

compio-runtime/src/runtime/time.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::{
2+
cmp::Reverse,
23
collections::BinaryHeap,
34
future::Future,
45
pin::Pin,
@@ -39,7 +40,7 @@ impl Ord for TimerEntry {
3940
pub struct TimerRuntime {
4041
time: Instant,
4142
tasks: Slab<FutureState>,
42-
wheel: BinaryHeap<TimerEntry>,
43+
wheel: BinaryHeap<Reverse<TimerEntry>>,
4344
}
4445

4546
impl TimerRuntime {
@@ -66,7 +67,7 @@ impl TimerRuntime {
6667
let key = self.tasks.insert(FutureState::Active(None));
6768
delay += elapsed;
6869
let entry = TimerEntry { key, delay };
69-
self.wheel.push(entry);
70+
self.wheel.push(Reverse(entry));
7071
Some(key)
7172
}
7273

@@ -83,8 +84,8 @@ impl TimerRuntime {
8384
pub fn min_timeout(&self) -> Option<Duration> {
8485
let elapsed = self.time.elapsed();
8586
self.wheel.peek().map(|entry| {
86-
if entry.delay > elapsed {
87-
entry.delay - elapsed
87+
if entry.0.delay > elapsed {
88+
entry.0.delay - elapsed
8889
} else {
8990
Duration::ZERO
9091
}
@@ -94,8 +95,8 @@ impl TimerRuntime {
9495
pub fn wake(&mut self) {
9596
let elapsed = self.time.elapsed();
9697
while let Some(entry) = self.wheel.pop() {
97-
if entry.delay <= elapsed {
98-
if let Some(state) = self.tasks.get_mut(entry.key) {
98+
if entry.0.delay <= elapsed {
99+
if let Some(state) = self.tasks.get_mut(entry.0.key) {
99100
let old_state = std::mem::replace(state, FutureState::Completed);
100101
if let FutureState::Active(Some(waker)) = old_state {
101102
waker.wake();
@@ -132,3 +133,15 @@ impl Drop for TimerFuture {
132133
Runtime::current().inner().cancel_timer(self.key);
133134
}
134135
}
136+
137+
#[test]
138+
fn timer_min_timeout() {
139+
let mut runtime = TimerRuntime::new();
140+
assert_eq!(runtime.min_timeout(), None);
141+
142+
runtime.insert(Duration::from_secs(1));
143+
runtime.insert(Duration::from_secs(10));
144+
let min_timeout = runtime.min_timeout().unwrap().as_secs_f32();
145+
146+
assert!(min_timeout < 1.);
147+
}

0 commit comments

Comments
 (0)