| //! Additional utilities for tracking time. |
| //! |
| //! This module provides additional utilities for executing code after a set period |
| //! of time. Currently there is only one: |
| //! |
| //! * `DelayQueue`: A queue where items are returned once the requested delay |
| //! has expired. |
| //! |
| //! This type must be used from within the context of the `Runtime`. |
| |
| use std::time::Duration; |
| |
| mod wheel; |
| |
| pub mod delay_queue; |
| |
| #[doc(inline)] |
| pub use delay_queue::DelayQueue; |
| |
| // ===== Internal utils ===== |
| |
| enum Round { |
| Up, |
| Down, |
| } |
| |
| /// Convert a `Duration` to milliseconds, rounding up and saturating at |
| /// `u64::MAX`. |
| /// |
| /// The saturating is fine because `u64::MAX` milliseconds are still many |
| /// million years. |
| #[inline] |
| fn ms(duration: Duration, round: Round) -> u64 { |
| const NANOS_PER_MILLI: u32 = 1_000_000; |
| const MILLIS_PER_SEC: u64 = 1_000; |
| |
| // Round up. |
| let millis = match round { |
| Round::Up => (duration.subsec_nanos() + NANOS_PER_MILLI - 1) / NANOS_PER_MILLI, |
| Round::Down => duration.subsec_millis(), |
| }; |
| |
| duration |
| .as_secs() |
| .saturating_mul(MILLIS_PER_SEC) |
| .saturating_add(u64::from(millis)) |
| } |