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
use alloc::sync::Arc; /// A way of waking up a specific task. /// /// By implementing this trait, types that are expected to be wrapped in an `Arc` /// can be converted into [`Waker`] objects. /// Those Wakers can be used to signal executors that a task it owns /// is ready to be `poll`ed again. /// /// Currently, there are two ways to convert `ArcWake` into [`Waker`]: /// /// * [`waker`](super::waker()) converts `Arc<impl ArcWake>` into [`Waker`]. /// * [`waker_ref`](super::waker_ref()) converts `&Arc<impl ArcWake>` into [`WakerRef`] that /// provides access to a [`&Waker`][`Waker`]. /// /// [`Waker`]: std::task::Waker /// [`WakerRef`]: super::WakerRef // Note: Send + Sync required because `Arc<T>` doesn't automatically imply // those bounds, but `Waker` implements them. pub trait ArcWake: Send + Sync { /// Indicates that the associated task is ready to make progress and should /// be `poll`ed. /// /// This function can be called from an arbitrary thread, including threads which /// did not create the `ArcWake` based [`Waker`]. /// /// Executors generally maintain a queue of "ready" tasks; `wake` should place /// the associated task onto this queue. /// /// [`Waker`]: std::task::Waker fn wake(self: Arc<Self>) { Self::wake_by_ref(&self) } /// Indicates that the associated task is ready to make progress and should /// be `poll`ed. /// /// This function can be called from an arbitrary thread, including threads which /// did not create the `ArcWake` based [`Waker`]. /// /// Executors generally maintain a queue of "ready" tasks; `wake_by_ref` should place /// the associated task onto this queue. /// /// This function is similar to [`wake`](ArcWake::wake), but must not consume the provided data /// pointer. /// /// [`Waker`]: std::task::Waker fn wake_by_ref(arc_self: &Arc<Self>); }