1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
use crate::future::{FutureObj, LocalFutureObj}; use core::fmt; /// The `Spawn` trait allows for pushing futures onto an executor that will /// run them to completion. pub trait Spawn { /// Spawns a future that will be run to completion. /// /// # Errors /// /// The executor may be unable to spawn tasks. Spawn errors should /// 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>; /// Determines whether the executor is able to spawn new tasks. /// /// This method will return `Ok` when the executor is *likely* /// (but not guaranteed) to accept a subsequent spawn attempt. /// Likewise, an `Err` return means that `spawn` is likely, but /// not guaranteed, to yield an error. #[inline] fn status(&self) -> Result<(), SpawnError> { Ok(()) } } /// The `LocalSpawn` is similar to `[Spawn]`, but allows spawning futures /// that don't implement `Send`. pub trait LocalSpawn { /// Spawns a future that will be run to completion. /// /// # Errors /// /// The executor may be unable to spawn tasks. Spawn errors should /// 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>; /// Determines whether the executor is able to spawn new tasks. /// /// This method will return `Ok` when the executor is *likely* /// (but not guaranteed) to accept a subsequent spawn attempt. /// Likewise, an `Err` return means that `spawn` is likely, but /// not guaranteed, to yield an error. #[inline] fn status_local(&self) -> Result<(), SpawnError> { Ok(()) } } /// An error that occurred during spawning. pub struct SpawnError { _hidden: (), } impl fmt::Debug for SpawnError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("SpanError") .field(&"shutdown") .finish() } } impl SpawnError { /// Spawning failed because the executor has been shut down. pub fn shutdown() -> Self { Self { _hidden: () } } /// Check whether spawning failed to the executor being shut down. pub fn is_shutdown(&self) -> bool { true } }