From 4fc2adae4fcc76fa8ff1169fed3db6d7c9100c4a Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Sun, 12 Apr 2020 23:55:37 +0200 Subject: [PATCH] task: make LocalSet non-Send (#2398) This does not count as a breaking change as it fixes a regression and a soundness bug. --- tokio/src/task/local.rs | 5 +++++ tokio/tests/async_send_sync.rs | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/tokio/src/task/local.rs b/tokio/src/task/local.rs index 551362a13..fce467079 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 f50b41a08..1fea19c2a 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>::scope(_, Rc, BoxFutureSync async_assert_fn!(tokio::task::LocalKey>::scope(_, Rc, BoxFutureSend<()>): !Send & !Sync); async_assert_fn!(tokio::task::LocalKey>::scope(_, Rc, 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);