From 07bd67164dfa09b10378b9665ab795ddd7559fad Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 21:30:51 +0900 Subject: [PATCH 1/8] Move Spawn/LocalSpawn from futures-core to futures-task --- Cargo.toml | 1 + futures-core/src/task/mod.rs | 3 --- futures-executor/Cargo.toml | 3 ++- futures-executor/src/local_pool.rs | 3 ++- futures-executor/src/thread_pool.rs | 3 ++- futures-task/Cargo.toml | 23 ++++++++++++++++ futures-task/src/lib.rs | 20 ++++++++++++++ .../src/task => futures-task/src}/spawn.rs | 26 +++++++------------ futures-test/Cargo.toml | 3 ++- futures-test/src/task/noop_spawner.rs | 2 +- futures-test/src/task/panic_spawner.rs | 2 +- futures-test/src/task/record_spawner.rs | 2 +- futures-util/Cargo.toml | 5 ++-- futures-util/src/compat/executor.rs | 2 +- .../src/stream/futures_unordered/mod.rs | 3 ++- futures-util/src/task/mod.rs | 1 + futures-util/src/task/spawn.rs | 4 +-- futures/Cargo.toml | 5 ++-- futures/src/lib.rs | 7 +++-- 19 files changed, 79 insertions(+), 39 deletions(-) create mode 100644 futures-task/Cargo.toml create mode 100644 futures-task/src/lib.rs rename {futures-core/src/task => futures-task/src}/spawn.rs (86%) diff --git a/Cargo.toml b/Cargo.toml index d6bd22b089..f963204539 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "futures-io", "futures-macro", "futures-sink", + "futures-task", "futures-util", "futures-test", ] diff --git a/futures-core/src/task/mod.rs b/futures-core/src/task/mod.rs index c03d4074f2..362b376e04 100644 --- a/futures-core/src/task/mod.rs +++ b/futures-core/src/task/mod.rs @@ -3,9 +3,6 @@ #[macro_use] mod poll; -mod spawn; -pub use self::spawn::{Spawn, LocalSpawn, SpawnError}; - #[doc(hidden)] pub mod __internal; diff --git a/futures-executor/Cargo.toml b/futures-executor/Cargo.toml index ac5f582253..f3df37c439 100644 --- a/futures-executor/Cargo.toml +++ b/futures-executor/Cargo.toml @@ -16,11 +16,12 @@ name = "futures_executor" [features] default = ["std"] -std = ["futures-core-preview/std", "futures-util-preview/std"] +std = ["futures-core-preview/std", "futures-task-preview/std", "futures-util-preview/std"] thread-pool = ["std", "num_cpus"] [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } +futures-task-preview = { path = "../futures-task", version = "=0.3.0-alpha.19", default-features = false } futures-util-preview = { path = "../futures-util", version = "=0.3.0-alpha.19", default-features = false } num_cpus = { version = "1.8.0", optional = true } diff --git a/futures-executor/src/local_pool.rs b/futures-executor/src/local_pool.rs index 578d71185f..d1791ef7c0 100644 --- a/futures-executor/src/local_pool.rs +++ b/futures-executor/src/local_pool.rs @@ -1,7 +1,8 @@ use crate::enter; use futures_core::future::{Future, FutureObj, LocalFutureObj}; use futures_core::stream::{Stream}; -use futures_core::task::{Context, Poll, Spawn, LocalSpawn, SpawnError}; +use futures_core::task::{Context, Poll}; +use futures_task::{Spawn, LocalSpawn, SpawnError}; use futures_util::task::{waker_ref, ArcWake}; use futures_util::stream::FuturesUnordered; use futures_util::stream::StreamExt; diff --git a/futures-executor/src/thread_pool.rs b/futures-executor/src/thread_pool.rs index 893d9ae5fc..6302f27e6d 100644 --- a/futures-executor/src/thread_pool.rs +++ b/futures-executor/src/thread_pool.rs @@ -1,7 +1,8 @@ use crate::enter; use crate::unpark_mutex::UnparkMutex; use futures_core::future::{Future, FutureObj}; -use futures_core::task::{Context, Poll, Spawn, SpawnError}; +use futures_core::task::{Context, Poll}; +use futures_task::{Spawn, SpawnError}; use futures_util::future::FutureExt; use futures_util::task::{ArcWake, waker_ref}; use std::cmp; diff --git a/futures-task/Cargo.toml b/futures-task/Cargo.toml new file mode 100644 index 0000000000..9cf4469ac7 --- /dev/null +++ b/futures-task/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "futures-task-preview" +edition = "2018" +version = "0.3.0-alpha.19" +authors = ["Alex Crichton "] +license = "MIT OR Apache-2.0" +repository = "https://github.com/rust-lang-nursery/futures-rs" +homepage = "https://rust-lang-nursery.github.io/futures-rs" +documentation = "https://rust-lang-nursery.github.io/futures-api-docs/0.3.0-alpha.18/futures_core" +description = """ +Tools for working with tasks. +""" + +[lib] +name = "futures_task" + +[features] +default = ["std"] +std = ["alloc"] +alloc = [] + +[dependencies] +futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19" } diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs new file mode 100644 index 0000000000..0565a2e6d4 --- /dev/null +++ b/futures-task/src/lib.rs @@ -0,0 +1,20 @@ +//! Tools for working with tasks. + +#![cfg_attr(not(feature = "std"), no_std)] + +#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms, unreachable_pub)] +// It cannot be included in the published code because this lints have false positives in the minimum required version. +#![cfg_attr(test, warn(single_use_lifetimes))] +#![warn(clippy::all)] + +#![doc(test(attr(deny(warnings), allow(dead_code, unused_assignments, unused_variables))))] + +#![doc(html_root_url = "https://docs.rs/futures-task-preview/0.3.0-alpha.19")] + +#[cfg(feature = "alloc")] +extern crate alloc; + +mod spawn; +pub use crate::spawn::{Spawn, SpawnError, LocalSpawn}; + +pub use futures_core::future::{FutureObj, LocalFutureObj}; diff --git a/futures-core/src/task/spawn.rs b/futures-task/src/spawn.rs similarity index 86% rename from futures-core/src/task/spawn.rs rename to futures-task/src/spawn.rs index 895e81b598..38997cff68 100644 --- a/futures-core/src/task/spawn.rs +++ b/futures-task/src/spawn.rs @@ -1,5 +1,5 @@ -use crate::future::{FutureObj, LocalFutureObj}; use core::fmt; +use futures_core::future::{FutureObj, LocalFutureObj}; /// The `Spawn` trait allows for pushing futures onto an executor that will /// run them to completion. @@ -12,8 +12,7 @@ pub trait Spawn { /// represent relatively rare scenarios, such as the executor /// having been shut down so that it is no longer able to accept /// tasks. - fn spawn_obj(&mut self, future: FutureObj<'static, ()>) - -> Result<(), SpawnError>; + fn spawn_obj(&mut self, future: FutureObj<'static, ()>) -> Result<(), SpawnError>; /// Determines whether the executor is able to spawn new tasks. /// @@ -38,8 +37,7 @@ pub trait LocalSpawn { /// represent relatively rare scenarios, such as the executor /// having been shut down so that it is no longer able to accept /// tasks. - fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) - -> Result<(), SpawnError>; + fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError>; /// Determines whether the executor is able to spawn new tasks. /// @@ -60,9 +58,7 @@ pub struct SpawnError { impl fmt::Debug for SpawnError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_tuple("SpawnError") - .field(&"shutdown") - .finish() + f.debug_tuple("SpawnError").field(&"shutdown").finish() } } @@ -88,8 +84,7 @@ impl SpawnError { } impl Spawn for &mut Sp { - fn spawn_obj(&mut self, future: FutureObj<'static, ()>) - -> Result<(), SpawnError> { + fn spawn_obj(&mut self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { Sp::spawn_obj(self, future) } @@ -99,8 +94,7 @@ impl Spawn for &mut Sp { } impl LocalSpawn for &mut Sp { - fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) - -> Result<(), SpawnError> { + fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> { Sp::spawn_local_obj(self, future) } @@ -111,12 +105,11 @@ impl LocalSpawn for &mut Sp { #[cfg(feature = "alloc")] mod if_alloc { - use alloc::boxed::Box; use super::*; + use alloc::boxed::Box; impl Spawn for Box { - fn spawn_obj(&mut self, future: FutureObj<'static, ()>) - -> Result<(), SpawnError> { + fn spawn_obj(&mut self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { (**self).spawn_obj(future) } @@ -126,8 +119,7 @@ mod if_alloc { } impl LocalSpawn for Box { - fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) - -> Result<(), SpawnError> { + fn spawn_local_obj(&mut self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> { (**self).spawn_local_obj(future) } diff --git a/futures-test/Cargo.toml b/futures-test/Cargo.toml index ef84e47e8b..20ce2095a2 100644 --- a/futures-test/Cargo.toml +++ b/futures-test/Cargo.toml @@ -16,6 +16,7 @@ name = "futures_test" [dependencies] futures-core-preview = { version = "=0.3.0-alpha.19", path = "../futures-core", default-features = false } +futures-task-preview = { version = "=0.3.0-alpha.19", path = "../futures-task", default-features = false } futures-io-preview = { version = "=0.3.0-alpha.19", path = "../futures-io", default-features = false } futures-util-preview = { version = "=0.3.0-alpha.19", path = "../futures-util", default-features = false } futures-executor-preview = { version = "=0.3.0-alpha.19", path = "../futures-executor", default-features = false } @@ -26,4 +27,4 @@ futures-preview = { version = "=0.3.0-alpha.19", path = "../futures", default-fe [features] default = ["std"] -std = ["futures-core-preview/std", "futures-io-preview/std", "futures-util-preview/std", "futures-util-preview/io", "futures-executor-preview/std"] +std = ["futures-core-preview/std", "futures-task-preview/std", "futures-io-preview/std", "futures-util-preview/std", "futures-util-preview/io", "futures-executor-preview/std"] diff --git a/futures-test/src/task/noop_spawner.rs b/futures-test/src/task/noop_spawner.rs index 947fd119e6..25b2a45657 100644 --- a/futures-test/src/task/noop_spawner.rs +++ b/futures-test/src/task/noop_spawner.rs @@ -1,5 +1,5 @@ use futures_core::future::FutureObj; -use futures_core::task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that /// discards spawned futures when used. diff --git a/futures-test/src/task/panic_spawner.rs b/futures-test/src/task/panic_spawner.rs index 4206d44d9e..3f0279409f 100644 --- a/futures-test/src/task/panic_spawner.rs +++ b/futures-test/src/task/panic_spawner.rs @@ -1,5 +1,5 @@ use futures_core::future::FutureObj; -use futures_core::task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that panics /// when used. diff --git a/futures-test/src/task/record_spawner.rs b/futures-test/src/task/record_spawner.rs index 3b13d00222..1cbf1fae77 100644 --- a/futures-test/src/task/record_spawner.rs +++ b/futures-test/src/task/record_spawner.rs @@ -1,5 +1,5 @@ use futures_core::future::FutureObj; -use futures_core::task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that records /// any [`Future`](futures_core::future::Future)s spawned on it. diff --git a/futures-util/Cargo.toml b/futures-util/Cargo.toml index 68cacdef42..e49dc55f59 100644 --- a/futures-util/Cargo.toml +++ b/futures-util/Cargo.toml @@ -16,8 +16,8 @@ name = "futures_util" [features] default = ["std"] -std = ["alloc", "futures-core-preview/std", "slab"] -alloc = ["futures-core-preview/alloc"] +std = ["alloc", "futures-core-preview/std", "futures-task-preview/std", "slab"] +alloc = ["futures-core-preview/alloc", "futures-task-preview/alloc"] async-await = [] async-await-macro = ["async-await", "futures-macro-preview", "proc-macro-hack", "proc-macro-nested"] compat = ["std", "futures_01"] @@ -36,6 +36,7 @@ read-initializer = ["io", "futures-io-preview/read-initializer", "futures-io-pre [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } +futures-task-preview = { path = "../futures-task", version = "=0.3.0-alpha.19", default-features = false } futures-channel-preview = { path = "../futures-channel", version = "=0.3.0-alpha.19", default-features = false, features = ["std"], optional = true } futures-io-preview = { path = "../futures-io", version = "=0.3.0-alpha.19", default-features = false, features = ["std"], optional = true } futures-sink-preview = { path = "../futures-sink", version = "=0.3.0-alpha.19", default-features = false, optional = true } diff --git a/futures-util/src/compat/executor.rs b/futures-util/src/compat/executor.rs index 1fe080055e..1da0740676 100644 --- a/futures-util/src/compat/executor.rs +++ b/futures-util/src/compat/executor.rs @@ -6,8 +6,8 @@ use crate::{ }; use futures_01::Future as Future01; use futures_01::future::{Executor as Executor01, ExecuteError as ExecuteError01}; -use futures_core::task::{Spawn as Spawn03, SpawnError as SpawnError03}; use futures_core::future::FutureObj; +use futures_task::{Spawn as Spawn03, SpawnError as SpawnError03}; /// A future that can run on a futures 0.1 /// [`Executor`](futures_01::future::Executor). diff --git a/futures-util/src/stream/futures_unordered/mod.rs b/futures-util/src/stream/futures_unordered/mod.rs index 6c8d8b1065..166d7f5ffc 100644 --- a/futures-util/src/stream/futures_unordered/mod.rs +++ b/futures-util/src/stream/futures_unordered/mod.rs @@ -6,7 +6,8 @@ use crate::task::{AtomicWaker}; use futures_core::future::{Future, FutureObj, LocalFutureObj}; use futures_core::stream::{FusedStream, Stream}; -use futures_core::task::{Context, Poll, Spawn, LocalSpawn, SpawnError}; +use futures_core::task::{Context, Poll}; +use futures_task::{Spawn, LocalSpawn, SpawnError}; use core::cell::UnsafeCell; use core::fmt::{self, Debug}; use core::iter::FromIterator; diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index fdc70136e9..3687f69ba5 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -28,3 +28,4 @@ mod spawn; pub use self::spawn::{SpawnExt, LocalSpawnExt}; pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; +pub use futures_task::{Spawn, LocalSpawn, SpawnError}; diff --git a/futures-util/src/task/spawn.rs b/futures-util/src/task/spawn.rs index a9a2e791b1..8955a3745d 100644 --- a/futures-util/src/task/spawn.rs +++ b/futures-util/src/task/spawn.rs @@ -1,4 +1,4 @@ -use futures_core::task::{LocalSpawn, Spawn}; +use futures_task::{LocalSpawn, Spawn}; #[cfg(feature = "compat")] use crate::compat::Compat; @@ -8,7 +8,7 @@ use crate::future::{FutureExt, RemoteHandle}; #[cfg(feature = "alloc")] use futures_core::future::{Future, FutureObj, LocalFutureObj}; #[cfg(feature = "alloc")] -use futures_core::task::SpawnError; +use futures_task::SpawnError; #[cfg(feature = "alloc")] use alloc::boxed::Box; diff --git a/futures/Cargo.toml b/futures/Cargo.toml index 119ae3e9e7..00debfc0f6 100644 --- a/futures/Cargo.toml +++ b/futures/Cargo.toml @@ -23,6 +23,7 @@ travis-ci = { repository = "rust-lang-nursery/futures-rs" } [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } +futures-task-preview = { path = "../futures-task", version = "=0.3.0-alpha.19", default-features = false } futures-channel-preview = { path = "../futures-channel", version = "=0.3.0-alpha.19", default-features = false, features = ["sink"] } futures-executor-preview = { path = "../futures-executor", version = "=0.3.0-alpha.19", default-features = false, optional = true } futures-io-preview = { path = "../futures-io", version = "=0.3.0-alpha.19", default-features = false } @@ -37,8 +38,8 @@ assert_matches = "1.3.0" [features] default = ["std", "executor"] -std = ["alloc", "futures-core-preview/std", "futures-io-preview/std", "futures-sink-preview/std", "futures-util-preview/std", "futures-util-preview/io", "futures-util-preview/channel"] -alloc = ["futures-core-preview/alloc", "futures-sink-preview/alloc", "futures-channel-preview/alloc", "futures-util-preview/alloc"] +std = ["alloc", "futures-core-preview/std", "futures-task-preview/std", "futures-io-preview/std", "futures-sink-preview/std", "futures-util-preview/std", "futures-util-preview/io", "futures-util-preview/channel"] +alloc = ["futures-core-preview/alloc", "futures-task-preview/alloc", "futures-sink-preview/alloc", "futures-channel-preview/alloc", "futures-util-preview/alloc"] async-await = ["futures-util-preview/async-await", "futures-util-preview/async-await-macro"] compat = ["std", "futures-util-preview/compat"] io-compat = ["compat", "futures-util-preview/io-compat"] diff --git a/futures/src/lib.rs b/futures/src/lib.rs index 3c95215b2b..b113ca0411 100644 --- a/futures/src/lib.rs +++ b/futures/src/lib.rs @@ -445,10 +445,9 @@ pub mod task { //! The remaining types and traits in the module are used for implementing //! executors or dealing with synchronization issues around task wakeup. - pub use futures_core::task::{ - Context, Poll, Spawn, LocalSpawn, SpawnError, - Waker, RawWaker, RawWakerVTable - }; + pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; + + pub use futures_task::{Spawn, LocalSpawn, SpawnError}; pub use futures_util::task::noop_waker; From bf190ac476c07b07d1adfc38044abbdb9f45ce54 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 21:42:17 +0900 Subject: [PATCH 2/8] Move AtomicWaker from futures-core to futures-task --- futures-channel/Cargo.toml | 1 + futures-channel/src/mpsc/mod.rs | 2 +- futures-core/src/{task/poll.rs => task.rs} | 4 ++++ futures-core/src/task/__internal/mod.rs | 4 ---- futures-core/src/task/mod.rs | 9 --------- futures-task/Cargo.toml | 6 ++++++ .../__internal => futures-task/src}/atomic_waker.rs | 4 ++-- futures-task/src/lib.rs | 10 ++++++++++ futures-util/src/task/mod.rs | 2 +- 9 files changed, 25 insertions(+), 17 deletions(-) rename futures-core/src/{task/poll.rs => task.rs} (80%) delete mode 100644 futures-core/src/task/__internal/mod.rs delete mode 100644 futures-core/src/task/mod.rs rename {futures-core/src/task/__internal => futures-task/src}/atomic_waker.rs (99%) diff --git a/futures-channel/Cargo.toml b/futures-channel/Cargo.toml index d45d946c84..e9b7105929 100644 --- a/futures-channel/Cargo.toml +++ b/futures-channel/Cargo.toml @@ -28,6 +28,7 @@ cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic"] [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } +futures-task-preview = { path = "../futures-task", version = "=0.3.0-alpha.19", default-features = false } futures-sink-preview = { path = "../futures-sink", version = "=0.3.0-alpha.19", default-features = false, optional = true } [dev-dependencies] diff --git a/futures-channel/src/mpsc/mod.rs b/futures-channel/src/mpsc/mod.rs index e9961e522c..f731ed3bc3 100644 --- a/futures-channel/src/mpsc/mod.rs +++ b/futures-channel/src/mpsc/mod.rs @@ -80,7 +80,7 @@ use futures_core::stream::{FusedStream, Stream}; use futures_core::task::{Context, Poll, Waker}; -use futures_core::task::__internal::AtomicWaker; +use futures_task::AtomicWaker; use std::fmt; use std::pin::Pin; use std::sync::{Arc, Mutex}; diff --git a/futures-core/src/task/poll.rs b/futures-core/src/task.rs similarity index 80% rename from futures-core/src/task/poll.rs rename to futures-core/src/task.rs index fc61683e76..3b7aa04114 100644 --- a/futures-core/src/task/poll.rs +++ b/futures-core/src/task.rs @@ -1,3 +1,7 @@ +//! Task notification. + +pub use core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; + /// Extracts the successful type of a `Poll`. /// /// This macro bakes in propagation of `Pending` signals by returning early. diff --git a/futures-core/src/task/__internal/mod.rs b/futures-core/src/task/__internal/mod.rs deleted file mode 100644 index 77e3678075..0000000000 --- a/futures-core/src/task/__internal/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] -mod atomic_waker; -#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] -pub use self::atomic_waker::AtomicWaker; diff --git a/futures-core/src/task/mod.rs b/futures-core/src/task/mod.rs deleted file mode 100644 index 362b376e04..0000000000 --- a/futures-core/src/task/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! Task notification. - -#[macro_use] -mod poll; - -#[doc(hidden)] -pub mod __internal; - -pub use core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; diff --git a/futures-task/Cargo.toml b/futures-task/Cargo.toml index 9cf4469ac7..1c34c628c9 100644 --- a/futures-task/Cargo.toml +++ b/futures-task/Cargo.toml @@ -19,5 +19,11 @@ default = ["std"] std = ["alloc"] alloc = [] +# Unstable features +# These features are outside of the normal semver guarantees and require the +# `unstable` feature as an explicit opt-in to unstable API. +unstable = [] +cfg-target-has-atomic = [] + [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19" } diff --git a/futures-core/src/task/__internal/atomic_waker.rs b/futures-task/src/atomic_waker.rs similarity index 99% rename from futures-core/src/task/__internal/atomic_waker.rs rename to futures-task/src/atomic_waker.rs index b381826986..2276e33104 100644 --- a/futures-core/src/task/__internal/atomic_waker.rs +++ b/futures-task/src/atomic_waker.rs @@ -1,8 +1,8 @@ -use core::fmt; use core::cell::UnsafeCell; +use core::fmt; use core::sync::atomic::AtomicUsize; use core::sync::atomic::Ordering::{Acquire, Release, AcqRel}; -use crate::task::Waker; +use core::task::Waker; /// A synchronization primitive for task wakeup. /// diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs index 0565a2e6d4..d9bb8df233 100644 --- a/futures-task/src/lib.rs +++ b/futures-task/src/lib.rs @@ -1,5 +1,7 @@ //! Tools for working with tasks. +#![cfg_attr(feature = "cfg-target-has-atomic", feature(cfg_target_has_atomic))] + #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs, missing_debug_implementations, rust_2018_idioms, unreachable_pub)] @@ -11,10 +13,18 @@ #![doc(html_root_url = "https://docs.rs/futures-task-preview/0.3.0-alpha.19")] +#[cfg(all(feature = "cfg-target-has-atomic", not(feature = "unstable")))] +compile_error!("The `cfg-target-has-atomic` feature requires the `unstable` feature as an explicit opt-in to unstable features"); + #[cfg(feature = "alloc")] extern crate alloc; mod spawn; pub use crate::spawn::{Spawn, SpawnError, LocalSpawn}; +#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] +mod atomic_waker; +#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] +pub use crate::atomic_waker::AtomicWaker; + pub use futures_core::future::{FutureObj, LocalFutureObj}; diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index 3687f69ba5..e361d73a90 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -16,7 +16,7 @@ cfg_target_has_atomic! { #[cfg(feature = "alloc")] pub use self::waker_ref::{waker_ref, WakerRef}; - pub use futures_core::task::__internal::AtomicWaker; + pub use futures_task::AtomicWaker; } mod noop_waker; From 1899c57548f0d395aa0e36e665eac6d78769ce40 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 21:56:51 +0900 Subject: [PATCH 3/8] Move other task utils from futures-core to futures-task --- .../src/task => futures-task/src}/arc_wake.rs | 0 futures-task/src/lib.rs | 38 +++++++++++++++++-- .../task => futures-task/src}/noop_waker.rs | 1 + .../src/task => futures-task/src}/waker.rs | 0 .../task => futures-task/src}/waker_ref.rs | 0 futures-util/src/task/mod.rs | 22 ++++------- 6 files changed, 43 insertions(+), 18 deletions(-) rename {futures-util/src/task => futures-task/src}/arc_wake.rs (100%) rename {futures-util/src/task => futures-task/src}/noop_waker.rs (99%) rename {futures-util/src/task => futures-task/src}/waker.rs (100%) rename {futures-util/src/task => futures-task/src}/waker_ref.rs (100%) diff --git a/futures-util/src/task/arc_wake.rs b/futures-task/src/arc_wake.rs similarity index 100% rename from futures-util/src/task/arc_wake.rs rename to futures-task/src/arc_wake.rs diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs index d9bb8df233..4c04c4a2e6 100644 --- a/futures-task/src/lib.rs +++ b/futures-task/src/lib.rs @@ -19,12 +19,42 @@ compile_error!("The `cfg-target-has-atomic` feature requires the `unstable` feat #[cfg(feature = "alloc")] extern crate alloc; +macro_rules! cfg_target_has_atomic { + ($($item:item)*) => {$( + #[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] + $item + )*}; +} + mod spawn; pub use crate::spawn::{Spawn, SpawnError, LocalSpawn}; -#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] -mod atomic_waker; -#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] -pub use crate::atomic_waker::AtomicWaker; +cfg_target_has_atomic! { + #[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] + mod atomic_waker; + #[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] + pub use crate::atomic_waker::AtomicWaker; + + #[cfg(feature = "alloc")] + mod arc_wake; + #[cfg(feature = "alloc")] + pub use crate::arc_wake::ArcWake; + + #[cfg(feature = "alloc")] + mod waker; + #[cfg(feature = "alloc")] + pub use crate::waker::waker; + + #[cfg(feature = "alloc")] + mod waker_ref; + #[cfg(feature = "alloc")] + pub use crate::waker_ref::{waker_ref, WakerRef}; +} + +mod noop_waker; +pub use crate::noop_waker::noop_waker; +#[cfg(feature = "std")] +pub use crate::noop_waker::noop_waker_ref; pub use futures_core::future::{FutureObj, LocalFutureObj}; +pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; diff --git a/futures-util/src/task/noop_waker.rs b/futures-task/src/noop_waker.rs similarity index 99% rename from futures-util/src/task/noop_waker.rs rename to futures-task/src/noop_waker.rs index b7016e1570..60f6d97af6 100644 --- a/futures-util/src/task/noop_waker.rs +++ b/futures-task/src/noop_waker.rs @@ -1,4 +1,5 @@ //! Utilities for creating zero-cost wakers that don't do anything. + use futures_core::task::{RawWaker, RawWakerVTable, Waker}; use core::ptr::null; #[cfg(feature = "std")] diff --git a/futures-util/src/task/waker.rs b/futures-task/src/waker.rs similarity index 100% rename from futures-util/src/task/waker.rs rename to futures-task/src/waker.rs diff --git a/futures-util/src/task/waker_ref.rs b/futures-task/src/waker_ref.rs similarity index 100% rename from futures-util/src/task/waker_ref.rs rename to futures-task/src/waker_ref.rs diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index e361d73a90..d60d4e4520 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -2,30 +2,24 @@ cfg_target_has_atomic! { #[cfg(feature = "alloc")] - mod arc_wake; - #[cfg(feature = "alloc")] - pub use self::arc_wake::ArcWake; + pub use futures_task::ArcWake; #[cfg(feature = "alloc")] - mod waker; - #[cfg(feature = "alloc")] - pub use self::waker::waker; + pub use futures_task::waker; #[cfg(feature = "alloc")] - mod waker_ref; - #[cfg(feature = "alloc")] - pub use self::waker_ref::{waker_ref, WakerRef}; + pub use futures_task::{waker_ref, WakerRef}; pub use futures_task::AtomicWaker; } -mod noop_waker; -pub use self::noop_waker::noop_waker; -#[cfg(feature = "std")] -pub use self::noop_waker::noop_waker_ref; - mod spawn; pub use self::spawn::{SpawnExt, LocalSpawnExt}; pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; + pub use futures_task::{Spawn, LocalSpawn, SpawnError}; + +pub use futures_task::noop_waker; +#[cfg(feature = "std")] +pub use futures_task::noop_waker_ref; From ca29c2ca012857951f1b6125b33c91757bba1562 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 22:02:45 +0900 Subject: [PATCH 4/8] Move FutureObj from futures-core to futures-task --- futures-core/src/{future/mod.rs => future.rs} | 3 --- futures-executor/src/local_pool.rs | 8 ++++---- futures-executor/src/thread_pool.rs | 6 +++--- .../src/future => futures-task/src}/future_obj.rs | 0 futures-task/src/lib.rs | 4 +++- futures-task/src/spawn.rs | 2 +- futures-test/src/task/noop_spawner.rs | 3 +-- futures-test/src/task/panic_spawner.rs | 3 +-- futures-test/src/task/record_spawner.rs | 3 +-- futures-util/src/compat/executor.rs | 3 +-- futures-util/src/future/mod.rs | 1 + futures-util/src/stream/futures_unordered/mod.rs | 5 ++--- futures-util/src/task/mod.rs | 5 ++++- futures-util/src/task/spawn.rs | 4 ++-- futures/src/lib.rs | 8 ++++++-- 15 files changed, 30 insertions(+), 28 deletions(-) rename futures-core/src/{future/mod.rs => future.rs} (97%) rename {futures-core/src/future => futures-task/src}/future_obj.rs (100%) diff --git a/futures-core/src/future/mod.rs b/futures-core/src/future.rs similarity index 97% rename from futures-core/src/future/mod.rs rename to futures-core/src/future.rs index ba9398eef6..35a0fd3baa 100644 --- a/futures-core/src/future/mod.rs +++ b/futures-core/src/future.rs @@ -6,9 +6,6 @@ use core::task::{Context, Poll}; pub use core::future::Future; -mod future_obj; -pub use self::future_obj::{FutureObj, LocalFutureObj, UnsafeFutureObj}; - /// An owned dynamically typed [`Future`] for use in cases where you can't /// statically type your result or need to add some indirection. #[cfg(feature = "alloc")] diff --git a/futures-executor/src/local_pool.rs b/futures-executor/src/local_pool.rs index d1791ef7c0..2f3ad70286 100644 --- a/futures-executor/src/local_pool.rs +++ b/futures-executor/src/local_pool.rs @@ -1,9 +1,9 @@ use crate::enter; -use futures_core::future::{Future, FutureObj, LocalFutureObj}; -use futures_core::stream::{Stream}; +use futures_core::future::Future; +use futures_core::stream::Stream; use futures_core::task::{Context, Poll}; -use futures_task::{Spawn, LocalSpawn, SpawnError}; -use futures_util::task::{waker_ref, ArcWake}; +use futures_task::{FutureObj, LocalFutureObj, Spawn, LocalSpawn, SpawnError}; +use futures_task::{waker_ref, ArcWake}; use futures_util::stream::FuturesUnordered; use futures_util::stream::StreamExt; use futures_util::pin_mut; diff --git a/futures-executor/src/thread_pool.rs b/futures-executor/src/thread_pool.rs index 6302f27e6d..f0192e86ec 100644 --- a/futures-executor/src/thread_pool.rs +++ b/futures-executor/src/thread_pool.rs @@ -1,10 +1,10 @@ use crate::enter; use crate::unpark_mutex::UnparkMutex; -use futures_core::future::{Future, FutureObj}; +use futures_core::future::Future; use futures_core::task::{Context, Poll}; -use futures_task::{Spawn, SpawnError}; +use futures_task::{FutureObj, Spawn, SpawnError}; +use futures_task::{ArcWake, waker_ref}; use futures_util::future::FutureExt; -use futures_util::task::{ArcWake, waker_ref}; use std::cmp; use std::fmt; use std::io; diff --git a/futures-core/src/future/future_obj.rs b/futures-task/src/future_obj.rs similarity index 100% rename from futures-core/src/future/future_obj.rs rename to futures-task/src/future_obj.rs diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs index 4c04c4a2e6..e2ca7ba736 100644 --- a/futures-task/src/lib.rs +++ b/futures-task/src/lib.rs @@ -51,10 +51,12 @@ cfg_target_has_atomic! { pub use crate::waker_ref::{waker_ref, WakerRef}; } +mod future_obj; +pub use crate::future_obj::{FutureObj, LocalFutureObj, UnsafeFutureObj}; + mod noop_waker; pub use crate::noop_waker::noop_waker; #[cfg(feature = "std")] pub use crate::noop_waker::noop_waker_ref; -pub use futures_core::future::{FutureObj, LocalFutureObj}; pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; diff --git a/futures-task/src/spawn.rs b/futures-task/src/spawn.rs index 38997cff68..9616e190ae 100644 --- a/futures-task/src/spawn.rs +++ b/futures-task/src/spawn.rs @@ -1,5 +1,5 @@ +use crate::{FutureObj, LocalFutureObj}; use core::fmt; -use futures_core::future::{FutureObj, LocalFutureObj}; /// The `Spawn` trait allows for pushing futures onto an executor that will /// run them to completion. diff --git a/futures-test/src/task/noop_spawner.rs b/futures-test/src/task/noop_spawner.rs index 25b2a45657..9225e87d0e 100644 --- a/futures-test/src/task/noop_spawner.rs +++ b/futures-test/src/task/noop_spawner.rs @@ -1,5 +1,4 @@ -use futures_core::future::FutureObj; -use futures_task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError, FutureObj}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that /// discards spawned futures when used. diff --git a/futures-test/src/task/panic_spawner.rs b/futures-test/src/task/panic_spawner.rs index 3f0279409f..8d3e978c89 100644 --- a/futures-test/src/task/panic_spawner.rs +++ b/futures-test/src/task/panic_spawner.rs @@ -1,5 +1,4 @@ -use futures_core::future::FutureObj; -use futures_task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError, FutureObj}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that panics /// when used. diff --git a/futures-test/src/task/record_spawner.rs b/futures-test/src/task/record_spawner.rs index 1cbf1fae77..960c39f9a8 100644 --- a/futures-test/src/task/record_spawner.rs +++ b/futures-test/src/task/record_spawner.rs @@ -1,5 +1,4 @@ -use futures_core::future::FutureObj; -use futures_task::{Spawn, SpawnError}; +use futures_task::{Spawn, SpawnError, FutureObj}; /// An implementation of [`Spawn`](futures_core::task::Spawn) that records /// any [`Future`](futures_core::future::Future)s spawned on it. diff --git a/futures-util/src/compat/executor.rs b/futures-util/src/compat/executor.rs index 1da0740676..311729bc0c 100644 --- a/futures-util/src/compat/executor.rs +++ b/futures-util/src/compat/executor.rs @@ -6,8 +6,7 @@ use crate::{ }; use futures_01::Future as Future01; use futures_01::future::{Executor as Executor01, ExecuteError as ExecuteError01}; -use futures_core::future::FutureObj; -use futures_task::{Spawn as Spawn03, SpawnError as SpawnError03}; +use futures_task::{FutureObj, Spawn as Spawn03, SpawnError as SpawnError03}; /// A future that can run on a futures 0.1 /// [`Executor`](futures_01::future::Executor). diff --git a/futures-util/src/future/mod.rs b/futures-util/src/future/mod.rs index 249fb59f22..3f4bb01436 100644 --- a/futures-util/src/future/mod.rs +++ b/futures-util/src/future/mod.rs @@ -7,6 +7,7 @@ #[cfg(feature = "alloc")] pub use futures_core::future::{BoxFuture, LocalBoxFuture}; pub use futures_core::future::{FusedFuture, Future, TryFuture}; +pub use futures_task::{FutureObj, LocalFutureObj, UnsafeFutureObj}; // Extension traits and combinators diff --git a/futures-util/src/stream/futures_unordered/mod.rs b/futures-util/src/stream/futures_unordered/mod.rs index 166d7f5ffc..9be98b91ad 100644 --- a/futures-util/src/stream/futures_unordered/mod.rs +++ b/futures-util/src/stream/futures_unordered/mod.rs @@ -3,11 +3,10 @@ //! This module is only available when the `std` or `alloc` feature of this //! library is activated, and it is activated by default. -use crate::task::{AtomicWaker}; -use futures_core::future::{Future, FutureObj, LocalFutureObj}; +use futures_core::future::Future; use futures_core::stream::{FusedStream, Stream}; use futures_core::task::{Context, Poll}; -use futures_task::{Spawn, LocalSpawn, SpawnError}; +use futures_task::{FutureObj, LocalFutureObj, AtomicWaker, Spawn, LocalSpawn, SpawnError}; use core::cell::UnsafeCell; use core::fmt::{self, Debug}; use core::iter::FromIterator; diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index d60d4e4520..1a1d1cab30 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -18,7 +18,10 @@ pub use self::spawn::{SpawnExt, LocalSpawnExt}; pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; -pub use futures_task::{Spawn, LocalSpawn, SpawnError}; +pub use futures_task::{ + Spawn, LocalSpawn, SpawnError, + FutureObj, LocalFutureObj, UnsafeFutureObj, +}; pub use futures_task::noop_waker; #[cfg(feature = "std")] diff --git a/futures-util/src/task/spawn.rs b/futures-util/src/task/spawn.rs index 8955a3745d..ba2b4be026 100644 --- a/futures-util/src/task/spawn.rs +++ b/futures-util/src/task/spawn.rs @@ -6,9 +6,9 @@ use futures_task::{LocalSpawn, Spawn}; #[cfg(feature = "std")] use crate::future::{FutureExt, RemoteHandle}; #[cfg(feature = "alloc")] -use futures_core::future::{Future, FutureObj, LocalFutureObj}; +use futures_core::future::Future; #[cfg(feature = "alloc")] -use futures_task::SpawnError; +use futures_task::{SpawnError, FutureObj, LocalFutureObj}; #[cfg(feature = "alloc")] use alloc::boxed::Box; diff --git a/futures/src/lib.rs b/futures/src/lib.rs index b113ca0411..11334dda5b 100644 --- a/futures/src/lib.rs +++ b/futures/src/lib.rs @@ -184,12 +184,13 @@ pub mod future { pub use futures_core::future::{ Future, TryFuture, FusedFuture, - FutureObj, LocalFutureObj, UnsafeFutureObj, }; #[cfg(feature = "alloc")] pub use futures_core::future::{BoxFuture, LocalBoxFuture}; + pub use futures_task::{FutureObj, LocalFutureObj, UnsafeFutureObj}; + pub use futures_util::future::{ lazy, Lazy, maybe_done, MaybeDone, @@ -447,7 +448,10 @@ pub mod task { pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; - pub use futures_task::{Spawn, LocalSpawn, SpawnError}; + pub use futures_task::{ + Spawn, LocalSpawn, SpawnError, + FutureObj, LocalFutureObj, UnsafeFutureObj, + }; pub use futures_util::task::noop_waker; From ddd53f55aa5bb37349d7bc2c1357f289b888632c Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 23:20:58 +0900 Subject: [PATCH 5/8] Fix no-std build --- futures-channel/Cargo.toml | 4 ++-- futures-task/Cargo.toml | 1 - futures-task/src/lib.rs | 2 +- futures-task/src/noop_waker.rs | 2 +- futures-util/Cargo.toml | 4 ++-- futures/Cargo.toml | 4 ++-- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/futures-channel/Cargo.toml b/futures-channel/Cargo.toml index e9b7105929..cc6a68db40 100644 --- a/futures-channel/Cargo.toml +++ b/futures-channel/Cargo.toml @@ -23,8 +23,8 @@ sink = ["futures-sink-preview"] # Unstable features # These features are outside of the normal semver guarantees and require the # `unstable` feature as an explicit opt-in to unstable API. -unstable = ["futures-core-preview/unstable"] -cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic"] +unstable = ["futures-core-preview/unstable", "futures-task-preview/unstable"] +cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic", "futures-task-preview/cfg-target-has-atomic"] [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } diff --git a/futures-task/Cargo.toml b/futures-task/Cargo.toml index 1c34c628c9..e87ea6edcb 100644 --- a/futures-task/Cargo.toml +++ b/futures-task/Cargo.toml @@ -26,4 +26,3 @@ unstable = [] cfg-target-has-atomic = [] [dependencies] -futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19" } diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs index e2ca7ba736..7efc685e59 100644 --- a/futures-task/src/lib.rs +++ b/futures-task/src/lib.rs @@ -59,4 +59,4 @@ pub use crate::noop_waker::noop_waker; #[cfg(feature = "std")] pub use crate::noop_waker::noop_waker_ref; -pub use futures_core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; +pub use core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; diff --git a/futures-task/src/noop_waker.rs b/futures-task/src/noop_waker.rs index 60f6d97af6..a0924ad925 100644 --- a/futures-task/src/noop_waker.rs +++ b/futures-task/src/noop_waker.rs @@ -1,6 +1,6 @@ //! Utilities for creating zero-cost wakers that don't do anything. -use futures_core::task::{RawWaker, RawWakerVTable, Waker}; +use core::task::{RawWaker, RawWakerVTable, Waker}; use core::ptr::null; #[cfg(feature = "std")] use core::cell::UnsafeCell; diff --git a/futures-util/Cargo.toml b/futures-util/Cargo.toml index e49dc55f59..93e9746710 100644 --- a/futures-util/Cargo.toml +++ b/futures-util/Cargo.toml @@ -29,8 +29,8 @@ channel = ["std", "futures-channel-preview"] # Unstable features # These features are outside of the normal semver guarantees and require the # `unstable` feature as an explicit opt-in to unstable API. -unstable = ["futures-core-preview/unstable"] -cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic"] +unstable = ["futures-core-preview/unstable", "futures-task-preview/unstable"] +cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic", "futures-task-preview/cfg-target-has-atomic"] bilock = [] read-initializer = ["io", "futures-io-preview/read-initializer", "futures-io-preview/unstable"] diff --git a/futures/Cargo.toml b/futures/Cargo.toml index 00debfc0f6..4caa87e728 100644 --- a/futures/Cargo.toml +++ b/futures/Cargo.toml @@ -49,8 +49,8 @@ thread-pool = ["executor", "futures-executor-preview/thread-pool"] # Unstable features # These features are outside of the normal semver guarantees and require the # `unstable` feature as an explicit opt-in to unstable API. -unstable = ["futures-core-preview/unstable", "futures-channel-preview/unstable", "futures-io-preview/unstable", "futures-util-preview/unstable"] -cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic", "futures-channel-preview/cfg-target-has-atomic", "futures-util-preview/cfg-target-has-atomic"] +unstable = ["futures-core-preview/unstable", "futures-task-preview/unstable", "futures-channel-preview/unstable", "futures-io-preview/unstable", "futures-util-preview/unstable"] +cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic", "futures-task-preview/cfg-target-has-atomic", "futures-channel-preview/cfg-target-has-atomic", "futures-util-preview/cfg-target-has-atomic"] bilock = ["futures-util-preview/bilock"] read-initializer = ["futures-io-preview/read-initializer", "futures-util-preview/read-initializer"] From 87e484c9505ed20cc176dc4be30e75e7fcdb9e0e Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Thu, 31 Oct 2019 23:40:38 +0900 Subject: [PATCH 6/8] Fix doc tests --- futures-task/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/futures-task/Cargo.toml b/futures-task/Cargo.toml index e87ea6edcb..356fb6f6fa 100644 --- a/futures-task/Cargo.toml +++ b/futures-task/Cargo.toml @@ -26,3 +26,6 @@ unstable = [] cfg-target-has-atomic = [] [dependencies] + +[dev-dependencies] +futures-preview = { path = "../futures", version = "=0.3.0-alpha.19" } From 3b39ea6949f9ae2c5fea75c155ee847f97c1aaa1 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Fri, 1 Nov 2019 00:12:40 +0900 Subject: [PATCH 7/8] Fix intra_doc_link_resolution_failure warnings --- futures-executor/src/local_pool.rs | 6 +++--- futures-task/src/arc_wake.rs | 6 +++--- futures-task/src/future_obj.rs | 3 +-- futures-test/src/task/mod.rs | 2 +- futures-test/src/task/noop_spawner.rs | 2 +- futures-test/src/task/panic_spawner.rs | 2 +- futures-test/src/task/record_spawner.rs | 2 +- futures-util/src/compat/executor.rs | 4 ++-- 8 files changed, 13 insertions(+), 14 deletions(-) diff --git a/futures-executor/src/local_pool.rs b/futures-executor/src/local_pool.rs index 2f3ad70286..84795dbfc0 100644 --- a/futures-executor/src/local_pool.rs +++ b/futures-executor/src/local_pool.rs @@ -20,10 +20,10 @@ use std::thread::{self, Thread}; /// little work in between I/O actions. /// /// To get a handle to the pool that implements -/// [`Spawn`](futures_core::task::Spawn), use the +/// [`Spawn`](futures_task::Spawn), use the /// [`spawner()`](LocalPool::spawner) method. Because the executor is /// single-threaded, it supports a special form of task spawning for non-`Send` -/// futures, via [`spawn_local_obj`](futures_core::task::LocalSpawn::spawn_local_obj). +/// futures, via [`spawn_local_obj`](futures_task::LocalSpawn::spawn_local_obj). #[derive(Debug)] pub struct LocalPool { pool: FuturesUnordered>, @@ -31,7 +31,7 @@ pub struct LocalPool { } /// A handle to a [`LocalPool`](LocalPool) that implements -/// [`Spawn`](futures_core::task::Spawn). +/// [`Spawn`](futures_task::Spawn). #[derive(Clone, Debug)] pub struct LocalSpawner { incoming: Weak, diff --git a/futures-task/src/arc_wake.rs b/futures-task/src/arc_wake.rs index 6307afc84f..aa6de0fc43 100644 --- a/futures-task/src/arc_wake.rs +++ b/futures-task/src/arc_wake.rs @@ -9,12 +9,12 @@ use alloc::sync::Arc; /// /// Currently, there are two ways to convert `ArcWake` into [`Waker`]: /// -/// * [`waker`](crate::task::waker()) converts `Arc` into [`Waker`]. -/// * [`waker_ref`](crate::task::waker_ref()) converts `&Arc` into [`WakerRef`] that +/// * [`waker`](super::waker()) converts `Arc` into [`Waker`]. +/// * [`waker_ref`](super::waker_ref()) converts `&Arc` into [`WakerRef`] that /// provides access to a [`&Waker`][`Waker`]. /// /// [`Waker`]: std::task::Waker -/// [`WakerRef`]: crate::task::WakerRef +/// [`WakerRef`]: super::WakerRef // Note: Send + Sync required because `Arc` doesn't automatically imply // those bounds, but `Waker` implements them. pub trait ArcWake: Send + Sync { diff --git a/futures-task/src/future_obj.rs b/futures-task/src/future_obj.rs index fe4dcf6cfc..6acdf7c37f 100644 --- a/futures-task/src/future_obj.rs +++ b/futures-task/src/future_obj.rs @@ -104,8 +104,7 @@ impl Drop for LocalFutureObj<'_, T> { /// contexts. /// /// You should generally not need to use this type outside of `no_std` or when -/// implementing `Spawn`, consider using [`BoxFuture`](crate::future::BoxFuture) -/// instead. +/// implementing `Spawn`, consider using `BoxFuture` instead. pub struct FutureObj<'a, T>(LocalFutureObj<'a, T>); impl Unpin for FutureObj<'_, T> {} diff --git a/futures-test/src/task/mod.rs b/futures-test/src/task/mod.rs index f2a834e041..3ed8d3c27b 100644 --- a/futures-test/src/task/mod.rs +++ b/futures-test/src/task/mod.rs @@ -12,7 +12,7 @@ //! This module provides utilities for creating test //! [`Context`](futures_core::task::Context)s, //! [`Waker`](futures_core::task::Waker)s and -//! [`Spawn`](futures_core::task::Spawn) implementations. +//! [`Spawn`](futures_task::Spawn) implementations. //! //! Test contexts: //! - [`noop_context`](crate::task::noop_context) creates a context that ignores calls to diff --git a/futures-test/src/task/noop_spawner.rs b/futures-test/src/task/noop_spawner.rs index 9225e87d0e..517a15b17d 100644 --- a/futures-test/src/task/noop_spawner.rs +++ b/futures-test/src/task/noop_spawner.rs @@ -1,6 +1,6 @@ use futures_task::{Spawn, SpawnError, FutureObj}; -/// An implementation of [`Spawn`](futures_core::task::Spawn) that +/// An implementation of [`Spawn`](futures_task::Spawn) that /// discards spawned futures when used. /// /// # Examples diff --git a/futures-test/src/task/panic_spawner.rs b/futures-test/src/task/panic_spawner.rs index 8d3e978c89..4766ee7171 100644 --- a/futures-test/src/task/panic_spawner.rs +++ b/futures-test/src/task/panic_spawner.rs @@ -1,6 +1,6 @@ use futures_task::{Spawn, SpawnError, FutureObj}; -/// An implementation of [`Spawn`](futures_core::task::Spawn) that panics +/// An implementation of [`Spawn`](futures_task::Spawn) that panics /// when used. /// /// # Examples diff --git a/futures-test/src/task/record_spawner.rs b/futures-test/src/task/record_spawner.rs index 960c39f9a8..3db983d5b8 100644 --- a/futures-test/src/task/record_spawner.rs +++ b/futures-test/src/task/record_spawner.rs @@ -1,6 +1,6 @@ use futures_task::{Spawn, SpawnError, FutureObj}; -/// An implementation of [`Spawn`](futures_core::task::Spawn) that records +/// An implementation of [`Spawn`](futures_task::Spawn) that records /// any [`Future`](futures_core::future::Future)s spawned on it. /// /// # Examples diff --git a/futures-util/src/compat/executor.rs b/futures-util/src/compat/executor.rs index 311729bc0c..2df900c45f 100644 --- a/futures-util/src/compat/executor.rs +++ b/futures-util/src/compat/executor.rs @@ -17,7 +17,7 @@ pub trait Executor01CompatExt: Executor01 + Clone + Send + 'static { /// Converts a futures 0.1 [`Executor`](futures_01::future::Executor) into a - /// futures 0.3 [`Spawn`](futures_core::task::Spawn). + /// futures 0.3 [`Spawn`](futures_task::Spawn). /// /// ``` /// use futures::task::SpawnExt; @@ -56,7 +56,7 @@ where Ex: Executor01 + Clone + Send + 'static } /// Converts a futures 0.1 [`Executor`](futures_01::future::Executor) into a -/// futures 0.3 [`Spawn`](futures_core::task::Spawn). +/// futures 0.3 [`Spawn`](futures_task::Spawn). #[derive(Debug, Clone)] pub struct Executor01As03 { executor01: Ex From 6fce3f9f0492f4182d0512dca747fa8e30dbaf2a Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Tue, 5 Nov 2019 18:13:14 +0900 Subject: [PATCH 8/8] Revert "Move AtomicWaker from futures-core to futures-task" This reverts commit dd664a39a7d3b384c30ecc436cd8279b9c7713fd. --- futures-channel/Cargo.toml | 5 ++--- futures-channel/src/mpsc/mod.rs | 2 +- .../src/task/__internal}/atomic_waker.rs | 0 futures-core/src/task/__internal/mod.rs | 4 ++++ futures-core/src/task/mod.rs | 9 +++++++++ futures-core/src/{task.rs => task/poll.rs} | 4 ---- futures-task/src/lib.rs | 5 ----- futures-util/src/stream/futures_unordered/mod.rs | 3 ++- futures-util/src/task/mod.rs | 2 +- 9 files changed, 19 insertions(+), 15 deletions(-) rename {futures-task/src => futures-core/src/task/__internal}/atomic_waker.rs (100%) create mode 100644 futures-core/src/task/__internal/mod.rs create mode 100644 futures-core/src/task/mod.rs rename futures-core/src/{task.rs => task/poll.rs} (80%) diff --git a/futures-channel/Cargo.toml b/futures-channel/Cargo.toml index cc6a68db40..d45d946c84 100644 --- a/futures-channel/Cargo.toml +++ b/futures-channel/Cargo.toml @@ -23,12 +23,11 @@ sink = ["futures-sink-preview"] # Unstable features # These features are outside of the normal semver guarantees and require the # `unstable` feature as an explicit opt-in to unstable API. -unstable = ["futures-core-preview/unstable", "futures-task-preview/unstable"] -cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic", "futures-task-preview/cfg-target-has-atomic"] +unstable = ["futures-core-preview/unstable"] +cfg-target-has-atomic = ["futures-core-preview/cfg-target-has-atomic"] [dependencies] futures-core-preview = { path = "../futures-core", version = "=0.3.0-alpha.19", default-features = false } -futures-task-preview = { path = "../futures-task", version = "=0.3.0-alpha.19", default-features = false } futures-sink-preview = { path = "../futures-sink", version = "=0.3.0-alpha.19", default-features = false, optional = true } [dev-dependencies] diff --git a/futures-channel/src/mpsc/mod.rs b/futures-channel/src/mpsc/mod.rs index f731ed3bc3..e9961e522c 100644 --- a/futures-channel/src/mpsc/mod.rs +++ b/futures-channel/src/mpsc/mod.rs @@ -80,7 +80,7 @@ use futures_core::stream::{FusedStream, Stream}; use futures_core::task::{Context, Poll, Waker}; -use futures_task::AtomicWaker; +use futures_core::task::__internal::AtomicWaker; use std::fmt; use std::pin::Pin; use std::sync::{Arc, Mutex}; diff --git a/futures-task/src/atomic_waker.rs b/futures-core/src/task/__internal/atomic_waker.rs similarity index 100% rename from futures-task/src/atomic_waker.rs rename to futures-core/src/task/__internal/atomic_waker.rs diff --git a/futures-core/src/task/__internal/mod.rs b/futures-core/src/task/__internal/mod.rs new file mode 100644 index 0000000000..77e3678075 --- /dev/null +++ b/futures-core/src/task/__internal/mod.rs @@ -0,0 +1,4 @@ +#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] +mod atomic_waker; +#[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] +pub use self::atomic_waker::AtomicWaker; diff --git a/futures-core/src/task/mod.rs b/futures-core/src/task/mod.rs new file mode 100644 index 0000000000..362b376e04 --- /dev/null +++ b/futures-core/src/task/mod.rs @@ -0,0 +1,9 @@ +//! Task notification. + +#[macro_use] +mod poll; + +#[doc(hidden)] +pub mod __internal; + +pub use core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; diff --git a/futures-core/src/task.rs b/futures-core/src/task/poll.rs similarity index 80% rename from futures-core/src/task.rs rename to futures-core/src/task/poll.rs index 3b7aa04114..fc61683e76 100644 --- a/futures-core/src/task.rs +++ b/futures-core/src/task/poll.rs @@ -1,7 +1,3 @@ -//! Task notification. - -pub use core::task::{Context, Poll, Waker, RawWaker, RawWakerVTable}; - /// Extracts the successful type of a `Poll`. /// /// This macro bakes in propagation of `Pending` signals by returning early. diff --git a/futures-task/src/lib.rs b/futures-task/src/lib.rs index 7efc685e59..18e6c02fda 100644 --- a/futures-task/src/lib.rs +++ b/futures-task/src/lib.rs @@ -30,11 +30,6 @@ mod spawn; pub use crate::spawn::{Spawn, SpawnError, LocalSpawn}; cfg_target_has_atomic! { - #[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] - mod atomic_waker; - #[cfg_attr(feature = "cfg-target-has-atomic", cfg(target_has_atomic = "ptr"))] - pub use crate::atomic_waker::AtomicWaker; - #[cfg(feature = "alloc")] mod arc_wake; #[cfg(feature = "alloc")] diff --git a/futures-util/src/stream/futures_unordered/mod.rs b/futures-util/src/stream/futures_unordered/mod.rs index 9be98b91ad..ff4efa8321 100644 --- a/futures-util/src/stream/futures_unordered/mod.rs +++ b/futures-util/src/stream/futures_unordered/mod.rs @@ -6,7 +6,8 @@ use futures_core::future::Future; use futures_core::stream::{FusedStream, Stream}; use futures_core::task::{Context, Poll}; -use futures_task::{FutureObj, LocalFutureObj, AtomicWaker, Spawn, LocalSpawn, SpawnError}; +use futures_task::{FutureObj, LocalFutureObj, Spawn, LocalSpawn, SpawnError}; +use crate::task::AtomicWaker; use core::cell::UnsafeCell; use core::fmt::{self, Debug}; use core::iter::FromIterator; diff --git a/futures-util/src/task/mod.rs b/futures-util/src/task/mod.rs index 1a1d1cab30..fb3b7adacd 100644 --- a/futures-util/src/task/mod.rs +++ b/futures-util/src/task/mod.rs @@ -10,7 +10,7 @@ cfg_target_has_atomic! { #[cfg(feature = "alloc")] pub use futures_task::{waker_ref, WakerRef}; - pub use futures_task::AtomicWaker; + pub use futures_core::task::__internal::AtomicWaker; } mod spawn;