diff options
Diffstat (limited to 'third_party/rust/tokio-timer/src/delay.rs')
-rw-r--r-- | third_party/rust/tokio-timer/src/delay.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/third_party/rust/tokio-timer/src/delay.rs b/third_party/rust/tokio-timer/src/delay.rs new file mode 100644 index 0000000000..c48adccd57 --- /dev/null +++ b/third_party/rust/tokio-timer/src/delay.rs @@ -0,0 +1,98 @@ +use timer::{HandlePriv, Registration}; +use Error; + +use futures::{Future, Poll}; + +use std::time::{Duration, Instant}; + +/// A future that completes at a specified instant in time. +/// +/// Instances of `Delay` perform no work and complete with `()` once the +/// specified deadline has been reached. +/// +/// `Delay` has a resolution of one millisecond and should not be used for tasks +/// that require high-resolution timers. +/// +/// # Cancellation +/// +/// Canceling a `Delay` is done by dropping the value. No additional cleanup or +/// other work is required. +/// +/// [`new`]: #method.new +#[derive(Debug)] +pub struct Delay { + /// The link between the `Delay` instance at the timer that drives it. + /// + /// This also stores the `deadline` value. + registration: Registration, +} + +impl Delay { + /// Create a new `Delay` instance that elapses at `deadline`. + /// + /// Only millisecond level resolution is guaranteed. There is no guarantee + /// as to how the sub-millisecond portion of `deadline` will be handled. + /// `Delay` should not be used for high-resolution timer use cases. + pub fn new(deadline: Instant) -> Delay { + let registration = Registration::new(deadline, Duration::from_millis(0)); + + Delay { registration } + } + + pub(crate) fn new_timeout(deadline: Instant, duration: Duration) -> Delay { + let registration = Registration::new(deadline, duration); + Delay { registration } + } + + pub(crate) fn new_with_handle(deadline: Instant, handle: HandlePriv) -> Delay { + let mut registration = Registration::new(deadline, Duration::from_millis(0)); + registration.register_with(handle); + + Delay { registration } + } + + /// Returns the instant at which the future will complete. + pub fn deadline(&self) -> Instant { + self.registration.deadline() + } + + /// Returns true if the `Delay` has elapsed + /// + /// A `Delay` is elapsed when the requested duration has elapsed. + pub fn is_elapsed(&self) -> bool { + self.registration.is_elapsed() + } + + /// Reset the `Delay` instance to a new deadline. + /// + /// Calling this function allows changing the instant at which the `Delay` + /// future completes without having to create new associated state. + /// + /// This function can be called both before and after the future has + /// completed. + pub fn reset(&mut self, deadline: Instant) { + self.registration.reset(deadline); + } + + pub(crate) fn reset_timeout(&mut self) { + self.registration.reset_timeout(); + } + + /// Register the delay with the timer instance for the current execution + /// context. + fn register(&mut self) { + self.registration.register(); + } +} + +impl Future for Delay { + type Item = (); + type Error = Error; + + fn poll(&mut self) -> Poll<Self::Item, Self::Error> { + // Ensure the `Delay` instance is associated with a timer. + self.register(); + + self.registration.poll_elapsed() + } +} |