diff --git a/cli/tokio_util.rs b/cli/tokio_util.rs index 7bbfeee655..8314197597 100644 --- a/cli/tokio_util.rs +++ b/cli/tokio_util.rs @@ -1,5 +1,6 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use crate::resources::Resource; +use deno::ErrBox; use futures; use futures::Future; use futures::Poll; @@ -10,11 +11,11 @@ use tokio; use tokio::net::TcpStream; use tokio::runtime; -pub fn create_threadpool_runtime() -> tokio::runtime::Runtime { +pub fn create_threadpool_runtime( +) -> Result<tokio::runtime::Runtime, tokio::io::Error> { runtime::Builder::new() .panic_handler(|err| std::panic::resume_unwind(err)) .build() - .unwrap() } pub fn run<F>(future: F) @@ -22,7 +23,7 @@ where F: Future<Item = (), Error = ()> + Send + 'static, { // tokio::runtime::current_thread::run(future) - let rt = create_threadpool_runtime(); + let rt = create_threadpool_runtime().expect("Unable to create Tokio runtime"); rt.block_on_all(future).unwrap(); } @@ -39,22 +40,27 @@ where /// given future. This is useful when we want to block the main runtime to /// resolve a future without worrying that we'll use up all the threads in the /// main runtime. -pub fn block_on<F, R, E>(future: F) -> Result<R, E> +pub fn block_on<F, R>(future: F) -> Result<R, ErrBox> where - F: Send + 'static + Future<Item = R, Error = E>, + F: Send + 'static + Future<Item = R, Error = ErrBox>, R: Send + 'static, - E: Send + 'static, { use std::sync::mpsc::channel; use std::thread; let (sender, receiver) = channel(); // Create a new runtime to evaluate the future asynchronously. thread::spawn(move || { - let mut rt = create_threadpool_runtime(); - let r = rt.block_on(future); - sender.send(r).unwrap(); + let r = match create_threadpool_runtime() { + Ok(mut rt) => rt.block_on(future), + Err(e) => Err(ErrBox::from(e)), + }; + sender + .send(r) + .expect("Unable to send blocking future result") }); - receiver.recv().unwrap() + receiver + .recv() + .expect("Unable to receive blocking future result") } // Set the default executor so we can use tokio::spawn(). It's difficult to @@ -65,7 +71,7 @@ pub fn init<F>(f: F) where F: FnOnce(), { - let rt = create_threadpool_runtime(); + let rt = create_threadpool_runtime().expect("Unable to create Tokio runtime"); let mut executor = rt.executor(); let mut enter = tokio_executor::enter().expect("Multiple executors at once"); tokio_executor::with_default(&mut executor, &mut enter, move |_enter| f());