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` into [`Waker`]. /// * [`waker_ref`](super::waker_ref()) converts `&Arc` into [`WakerRef`] that /// provides access to a [`&Waker`][`Waker`]. /// /// [`Waker`]: std::task::Waker /// [`WakerRef`]: super::WakerRef // Note: Send + Sync required because `Arc` 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::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); }