diff options
Diffstat (limited to 'cli/global_timer.rs')
-rw-r--r-- | cli/global_timer.rs | 46 |
1 files changed, 0 insertions, 46 deletions
diff --git a/cli/global_timer.rs b/cli/global_timer.rs index bf335bff0..6fad563a2 100644 --- a/cli/global_timer.rs +++ b/cli/global_timer.rs @@ -1,47 +1 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. - -//! This module helps deno implement timers. -//! -//! As an optimization, we want to avoid an expensive calls into rust for every -//! setTimeout in JavaScript. Thus in //js/timers.ts a data structure is -//! implemented that calls into Rust for only the smallest timeout. Thus we -//! only need to be able to start and cancel a single timer (or Delay, as Tokio -//! calls it) for an entire Isolate. This is what is implemented here. - -use futures::channel::oneshot; -use futures::future::FutureExt; -use futures::TryFutureExt; -use std::future::Future; -use std::time::Instant; - -#[derive(Default)] -pub struct GlobalTimer { - tx: Option<oneshot::Sender<()>>, -} - -impl GlobalTimer { - pub fn cancel(&mut self) { - if let Some(tx) = self.tx.take() { - tx.send(()).ok(); - } - } - - pub fn new_timeout( - &mut self, - deadline: Instant, - ) -> impl Future<Output = Result<(), ()>> { - if self.tx.is_some() { - self.cancel(); - } - assert!(self.tx.is_none()); - - let (tx, rx) = oneshot::channel(); - self.tx = Some(tx); - - let delay = tokio::time::delay_until(deadline.into()); - let rx = rx - .map_err(|err| panic!("Unexpected error in receiving channel {:?}", err)); - - futures::future::select(delay, rx).then(|_| futures::future::ok(())) - } -} |