From 1629373ee36bec4684678d8f336d4f2718c646d5 Mon Sep 17 00:00:00 2001 From: Naja Melan Date: Sun, 19 Jan 2020 20:28:29 +0100 Subject: [PATCH] Add impl Spawn and LocalSpawn for Arc and Rc. Since #1950 (0.3.0) the Spawn and LocalSpawn only require a shared reference for spawning operations. This adds blanket impls for `Arc` and `Rc`. It does the same for LocalSpawn. This allows client code to pass an Arc when library code takes parameters as `&dyn Spawn` or `impl Spawn`. So far there were blanket impls for `&`, `&mut` and `Box`. --- futures-task/src/spawn.rs | 44 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/futures-task/src/spawn.rs b/futures-task/src/spawn.rs index 815411da8b..7f65088a6c 100644 --- a/futures-task/src/spawn.rs +++ b/futures-task/src/spawn.rs @@ -126,7 +126,7 @@ impl LocalSpawn for &mut Sp { #[cfg(feature = "alloc")] mod if_alloc { use super::*; - use alloc::boxed::Box; + use alloc::{ boxed::Box, sync::Arc, rc::Rc }; impl Spawn for Box { fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { @@ -147,4 +147,46 @@ mod if_alloc { (**self).status_local() } } + + impl Spawn for Rc { + fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { + (**self).spawn_obj(future) + } + + fn status(&self) -> Result<(), SpawnError> { + (**self).status() + } + } + + impl LocalSpawn for Rc { + fn spawn_local_obj(&self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> { + (**self).spawn_local_obj(future) + } + + fn status_local(&self) -> Result<(), SpawnError> { + (**self).status_local() + } + } + + cfg_target_has_atomic! { + impl Spawn for Arc { + fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> { + (**self).spawn_obj(future) + } + + fn status(&self) -> Result<(), SpawnError> { + (**self).status() + } + } + + impl LocalSpawn for Arc { + fn spawn_local_obj(&self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> { + (**self).spawn_local_obj(future) + } + + fn status_local(&self) -> Result<(), SpawnError> { + (**self).status_local() + } + } + } }