diff options
author | Jon Gjengset <jon@thesquareplanet.com> | 2020-04-20 19:18:47 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-20 19:18:47 -0400 |
commit | 282b00cbe888a96669877ce70662fba87e8c0e3c (patch) | |
tree | 49482c1ffc2862e8154fe81aec5a3c24eac8ba5a /tokio/tests | |
parent | 5a548044d7bfd5d1c59d1a398d34ccbc29cbfe70 (diff) |
Be more principled about when blocking is ok (#2410)
This enables `block_in_place` to be used in more contexts. Specifically,
it allows you to block whenever you are off the tokio runtime (like if
you are not using tokio, are in a `spawn_blocking` closure, etc.), and
in the threaded scheduler's `block_on`. Blocking in `LocalSet` and the
basic scheduler's` block_on` is still disallowed.
Fixes #2327.
Fixes #2393.
Diffstat (limited to 'tokio/tests')
-rw-r--r-- | tokio/tests/task_blocking.rs | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/tokio/tests/task_blocking.rs b/tokio/tests/task_blocking.rs index edcb005d..72fed01e 100644 --- a/tokio/tests/task_blocking.rs +++ b/tokio/tests/task_blocking.rs @@ -1,7 +1,7 @@ #![warn(rust_2018_idioms)] #![cfg(feature = "full")] -use tokio::task; +use tokio::{runtime, task}; use tokio_test::assert_ok; use std::thread; @@ -29,6 +29,29 @@ async fn basic_blocking() { } #[tokio::test(threaded_scheduler)] +async fn block_in_blocking() { + // Run a few times + for _ in 0..100 { + let out = assert_ok!( + tokio::spawn(async { + assert_ok!( + task::spawn_blocking(|| { + task::block_in_place(|| { + thread::sleep(Duration::from_millis(5)); + }); + "hello" + }) + .await + ) + }) + .await + ); + + assert_eq!(out, "hello"); + } +} + +#[tokio::test(threaded_scheduler)] async fn block_in_block() { // Run a few times for _ in 0..100 { @@ -47,3 +70,29 @@ async fn block_in_block() { assert_eq!(out, "hello"); } } + +#[tokio::test(basic_scheduler)] +#[should_panic] +async fn no_block_in_basic_scheduler() { + task::block_in_place(|| {}); +} + +#[test] +fn yes_block_in_threaded_block_on() { + let mut rt = runtime::Builder::new() + .threaded_scheduler() + .build() + .unwrap(); + rt.block_on(async { + task::block_in_place(|| {}); + }); +} + +#[test] +#[should_panic] +fn no_block_in_basic_block_on() { + let mut rt = runtime::Builder::new().basic_scheduler().build().unwrap(); + rt.block_on(async { + task::block_in_place(|| {}); + }); +} |