Skip to content

Commit 3f0e90c

Browse files
najamelancramertj
authored andcommitted
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<Sp: ?Sized + Spawn>` and `Rc<Sp: ?Sized + Spawn>`. It does the same for LocalSpawn. This allows client code to pass an Arc<Exec> when library code takes parameters as `&dyn Spawn` or `impl Spawn`. So far there were blanket impls for `&`, `&mut` and `Box`.
1 parent c600651 commit 3f0e90c

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

futures-task/src/spawn.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl<Sp: ?Sized + LocalSpawn> LocalSpawn for &mut Sp {
126126
#[cfg(feature = "alloc")]
127127
mod if_alloc {
128128
use super::*;
129-
use alloc::boxed::Box;
129+
use alloc::{ boxed::Box, rc::Rc };
130130

131131
impl<Sp: ?Sized + Spawn> Spawn for Box<Sp> {
132132
fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> {
@@ -147,4 +147,48 @@ mod if_alloc {
147147
(**self).status_local()
148148
}
149149
}
150+
151+
impl<Sp: ?Sized + Spawn> Spawn for Rc<Sp> {
152+
fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> {
153+
(**self).spawn_obj(future)
154+
}
155+
156+
fn status(&self) -> Result<(), SpawnError> {
157+
(**self).status()
158+
}
159+
}
160+
161+
impl<Sp: ?Sized + LocalSpawn> LocalSpawn for Rc<Sp> {
162+
fn spawn_local_obj(&self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> {
163+
(**self).spawn_local_obj(future)
164+
}
165+
166+
fn status_local(&self) -> Result<(), SpawnError> {
167+
(**self).status_local()
168+
}
169+
}
170+
171+
cfg_target_has_atomic! {
172+
use alloc::{ sync::Arc };
173+
174+
impl<Sp: ?Sized + Spawn> Spawn for Arc<Sp> {
175+
fn spawn_obj(&self, future: FutureObj<'static, ()>) -> Result<(), SpawnError> {
176+
(**self).spawn_obj(future)
177+
}
178+
179+
fn status(&self) -> Result<(), SpawnError> {
180+
(**self).status()
181+
}
182+
}
183+
184+
impl<Sp: ?Sized + LocalSpawn> LocalSpawn for Arc<Sp> {
185+
fn spawn_local_obj(&self, future: LocalFutureObj<'static, ()>) -> Result<(), SpawnError> {
186+
(**self).spawn_local_obj(future)
187+
}
188+
189+
fn status_local(&self) -> Result<(), SpawnError> {
190+
(**self).status_local()
191+
}
192+
}
193+
}
150194
}

0 commit comments

Comments
 (0)