mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-09 00:00:08 +02:00
48 lines
1.1 KiB
Rust
48 lines
1.1 KiB
Rust
//! 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;
|
||
|
|
|
||
|
|
#[doc(inline)]
|
||
|
|
pub mod delay_queue;
|
||
|
|
|
||
|
|
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))
|
||
|
|
}
|