1
1
use std:: {
2
+ cmp:: Reverse ,
2
3
collections:: BinaryHeap ,
3
4
future:: Future ,
4
5
pin:: Pin ,
@@ -39,7 +40,7 @@ impl Ord for TimerEntry {
39
40
pub struct TimerRuntime {
40
41
time : Instant ,
41
42
tasks : Slab < FutureState > ,
42
- wheel : BinaryHeap < TimerEntry > ,
43
+ wheel : BinaryHeap < Reverse < TimerEntry > > ,
43
44
}
44
45
45
46
impl TimerRuntime {
@@ -66,7 +67,7 @@ impl TimerRuntime {
66
67
let key = self . tasks . insert ( FutureState :: Active ( None ) ) ;
67
68
delay += elapsed;
68
69
let entry = TimerEntry { key, delay } ;
69
- self . wheel . push ( entry) ;
70
+ self . wheel . push ( Reverse ( entry) ) ;
70
71
Some ( key)
71
72
}
72
73
@@ -83,8 +84,8 @@ impl TimerRuntime {
83
84
pub fn min_timeout ( & self ) -> Option < Duration > {
84
85
let elapsed = self . time . elapsed ( ) ;
85
86
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
88
89
} else {
89
90
Duration :: ZERO
90
91
}
@@ -94,8 +95,8 @@ impl TimerRuntime {
94
95
pub fn wake ( & mut self ) {
95
96
let elapsed = self . time . elapsed ( ) ;
96
97
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 ) {
99
100
let old_state = std:: mem:: replace ( state, FutureState :: Completed ) ;
100
101
if let FutureState :: Active ( Some ( waker) ) = old_state {
101
102
waker. wake ( ) ;
@@ -132,3 +133,15 @@ impl Drop for TimerFuture {
132
133
Runtime :: current ( ) . inner ( ) . cancel_timer ( self . key ) ;
133
134
}
134
135
}
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