diff options
-rw-r--r-- | tokio/src/task/local.rs | 5 | ||||
-rw-r--r-- | tokio/tests/async_send_sync.rs | 39 |
2 files changed, 44 insertions, 0 deletions
diff --git a/tokio/src/task/local.rs b/tokio/src/task/local.rs index 551362a1..fce46707 100644 --- a/tokio/src/task/local.rs +++ b/tokio/src/task/local.rs @@ -7,6 +7,7 @@ use std::cell::{Cell, RefCell}; use std::collections::VecDeque; use std::fmt; use std::future::Future; +use std::marker::PhantomData; use std::pin::Pin; use std::sync::{Arc, Mutex}; use std::task::Poll; @@ -114,6 +115,9 @@ cfg_rt_util! { /// State available from thread-local context: Context, + + /// This type should not be Send. + _not_send: PhantomData<*const ()>, } } @@ -228,6 +232,7 @@ impl LocalSet { waker: AtomicWaker::new(), }), }, + _not_send: PhantomData, } } diff --git a/tokio/tests/async_send_sync.rs b/tokio/tests/async_send_sync.rs index f50b41a0..1fea19c2 100644 --- a/tokio/tests/async_send_sync.rs +++ b/tokio/tests/async_send_sync.rs @@ -41,6 +41,44 @@ macro_rules! into_todo { x }}; } +macro_rules! assert_value { + ($type:ty: Send & Sync) => { + #[allow(unreachable_code)] + #[allow(unused_variables)] + const _: fn() = || { + let f: $type = todo!(); + require_send(&f); + require_sync(&f); + }; + }; + ($type:ty: !Send & Sync) => { + #[allow(unreachable_code)] + #[allow(unused_variables)] + const _: fn() = || { + let f: $type = todo!(); + AmbiguousIfSend::some_item(&f); + require_sync(&f); + }; + }; + ($type:ty: Send & !Sync) => { + #[allow(unreachable_code)] + #[allow(unused_variables)] + const _: fn() = || { + let f: $type = todo!(); + require_send(&f); + AmbiguousIfSync::some_item(&f); + }; + }; + ($type:ty: !Send & !Sync) => { + #[allow(unreachable_code)] + #[allow(unused_variables)] + const _: fn() = || { + let f: $type = todo!(); + AmbiguousIfSend::some_item(&f); + AmbiguousIfSync::some_item(&f); + }; + }; +} macro_rules! async_assert_fn { ($($f:ident $(< $($generic:ty),* > )? )::+($($arg:ty),*): Send & Sync) => { #[allow(unreachable_code)] @@ -206,6 +244,7 @@ async_assert_fn!(tokio::task::LocalKey<Rc<u32>>::scope(_, Rc<u32>, BoxFutureSync async_assert_fn!(tokio::task::LocalKey<Rc<u32>>::scope(_, Rc<u32>, BoxFutureSend<()>): !Send & !Sync); async_assert_fn!(tokio::task::LocalKey<Rc<u32>>::scope(_, Rc<u32>, BoxFuture<()>): !Send & !Sync); async_assert_fn!(tokio::task::LocalSet::run_until(_, BoxFutureSync<()>): !Send & !Sync); +assert_value!(tokio::task::LocalSet: !Send & !Sync); async_assert_fn!(tokio::time::advance(Duration): Send & Sync); async_assert_fn!(tokio::time::delay_for(Duration): Send & Sync); |