mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-22 00:00:11 +02:00
Make tokio::run panic if called from inside tokio::run (#646)
This is implemented by creating an `Enter` instance from within `run`. This patch also introduces `Enter::block_on`. Fixes #504
This commit is contained in:
committed by
Carl Lerche
parent
85f8522536
commit
98d23b8b29
+4
-1
@@ -125,6 +125,7 @@ use reactor::{Background, Handle};
|
||||
|
||||
use std::io;
|
||||
|
||||
use tokio_executor::enter;
|
||||
use tokio_threadpool as threadpool;
|
||||
|
||||
use futures;
|
||||
@@ -210,7 +211,9 @@ where F: Future<Item = (), Error = ()> + Send + 'static,
|
||||
{
|
||||
let mut runtime = Runtime::new().unwrap();
|
||||
runtime.spawn(future);
|
||||
runtime.shutdown_on_idle().wait().unwrap();
|
||||
enter().expect("nested tokio::run")
|
||||
.block_on(runtime.shutdown_on_idle())
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
impl Runtime {
|
||||
|
||||
@@ -390,3 +390,15 @@ mod from_block_on_all {
|
||||
test(|f| { tokio::spawn(f); })
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn run_in_run() {
|
||||
use std::panic;
|
||||
|
||||
tokio::run(lazy(|| {
|
||||
panic::catch_unwind(|| {
|
||||
tokio::run(lazy(|| { Ok::<(), ()>(()) }))
|
||||
}).unwrap_err();
|
||||
Ok::<(), ()>(())
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@ use std::cell::Cell;
|
||||
use std::error::Error;
|
||||
use std::fmt;
|
||||
|
||||
use futures::{self, Future};
|
||||
|
||||
thread_local!(static ENTERED: Cell<bool> = Cell::new(false));
|
||||
|
||||
/// Represents an executor context.
|
||||
@@ -80,6 +82,13 @@ impl Enter {
|
||||
pub fn make_permanent(mut self) {
|
||||
self.permanent = true;
|
||||
}
|
||||
|
||||
/// Blocks the thread on the specified future, returning the value with
|
||||
/// which that future completes.
|
||||
pub fn block_on<F: Future>(&mut self, f: F) -> Result<F::Item, F::Error> {
|
||||
futures::executor::spawn(f).wait_future()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl fmt::Debug for Enter {
|
||||
|
||||
Reference in New Issue
Block a user