1 use alloc::sync::Arc; 2 3 /// A way of waking up a specific task. 4 /// 5 /// By implementing this trait, types that are expected to be wrapped in an `Arc` 6 /// can be converted into [`Waker`] objects. 7 /// Those Wakers can be used to signal executors that a task it owns 8 /// is ready to be `poll`ed again. 9 /// 10 /// Currently, there are two ways to convert `ArcWake` into [`Waker`]: 11 /// 12 /// * [`waker`](super::waker()) converts `Arc<impl ArcWake>` into [`Waker`]. 13 /// * [`waker_ref`](super::waker_ref()) converts `&Arc<impl ArcWake>` into [`WakerRef`] that 14 /// provides access to a [`&Waker`][`Waker`]. 15 /// 16 /// [`Waker`]: std::task::Waker 17 /// [`WakerRef`]: super::WakerRef 18 // Note: Send + Sync required because `Arc<T>` doesn't automatically imply 19 // those bounds, but `Waker` implements them. 20 pub trait ArcWake: Send + Sync { 21 /// Indicates that the associated task is ready to make progress and should 22 /// be `poll`ed. 23 /// 24 /// This function can be called from an arbitrary thread, including threads which 25 /// did not create the `ArcWake` based [`Waker`]. 26 /// 27 /// Executors generally maintain a queue of "ready" tasks; `wake` should place 28 /// the associated task onto this queue. 29 /// 30 /// [`Waker`]: std::task::Waker wake(self: Arc<Self>)31 fn wake(self: Arc<Self>) { 32 Self::wake_by_ref(&self) 33 } 34 35 /// Indicates that the associated task is ready to make progress and should 36 /// be `poll`ed. 37 /// 38 /// This function can be called from an arbitrary thread, including threads which 39 /// did not create the `ArcWake` based [`Waker`]. 40 /// 41 /// Executors generally maintain a queue of "ready" tasks; `wake_by_ref` should place 42 /// the associated task onto this queue. 43 /// 44 /// This function is similar to [`wake`](ArcWake::wake), but must not consume the provided data 45 /// pointer. 46 /// 47 /// [`Waker`]: std::task::Waker wake_by_ref(arc_self: &Arc<Self>)48 fn wake_by_ref(arc_self: &Arc<Self>); 49 } 50