Skip to content

Commit 0c3f75f

Browse files
authored
Miscellaneous timer fixes (#129)
1 parent b73a368 commit 0c3f75f

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,16 @@ impl Timer {
282282
/// [`never()`] will never fire, and timers created with [`after()`] or [`at()`] will fire
283283
/// if the duration is not too large.
284284
///
285+
/// [`never()`]: Timer::never()
286+
/// [`after()`]: Timer::after()
287+
/// [`at()`]: Timer::at()
288+
///
285289
/// # Examples
286290
///
287291
/// ```
292+
/// # futures_lite::future::block_on(async {
288293
/// use async_io::Timer;
294+
/// use futures_lite::prelude::*;
289295
/// use std::time::Duration;
290296
///
291297
/// // `never` will never fire.
@@ -294,6 +300,19 @@ impl Timer {
294300
/// // `after` will fire if the duration is not too large.
295301
/// assert!(Timer::after(Duration::from_secs(1)).will_fire());
296302
/// assert!(!Timer::after(Duration::MAX).will_fire());
303+
///
304+
/// // However, once an `after` timer has fired, it will never fire again.
305+
/// let mut t = Timer::after(Duration::from_secs(1));
306+
/// assert!(t.will_fire());
307+
/// (&mut t).await;
308+
/// assert!(!t.will_fire());
309+
///
310+
/// // Interval timers will fire periodically.
311+
/// let mut t = Timer::interval(Duration::from_secs(1));
312+
/// assert!(t.will_fire());
313+
/// t.next().await;
314+
/// assert!(t.will_fire());
315+
/// # });
297316
/// ```
298317
#[inline]
299318
pub fn will_fire(&self) -> bool {
@@ -473,6 +492,8 @@ impl Stream for Timer {
473492
// Register the timer in the reactor.
474493
let id = Reactor::get().insert_timer(next, cx.waker());
475494
this.id_and_waker = Some((id, cx.waker().clone()));
495+
} else {
496+
this.when = None;
476497
}
477498
return Poll::Ready(Some(result_time));
478499
} else {

0 commit comments

Comments
 (0)