1- #![ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
1+ #![ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
22//! Types and Traits for working with asynchronous tasks.
33use core:: mem:: ManuallyDrop ;
44use core:: task:: { RawWaker , RawWakerVTable , Waker } ;
@@ -16,26 +16,78 @@ use crate::sync::Arc;
1616/// to wake up a task is stored in an [`Arc`]. Some executors (especially
1717/// those for embedded systems) cannot use this API, which is why [`RawWaker`]
1818/// exists as an alternative for those systems.
19- #[ unstable( feature = "wake_trait" , issue = "69912" ) ]
19+ ///
20+ /// [arc]: ../../std/sync/struct.Arc.html
21+ ///
22+ /// # Examples
23+ ///
24+ /// A basic `block_on` function that takes a future and runs it to completion on
25+ /// the current thread.
26+ ///
27+ /// **Note:** This example trades correctness for simplicity. In order to prevent
28+ /// deadlocks, production-grade implementations will also need to handle
29+ /// intermediate calls to `thread::unpark` as well as nested invocations.
30+ ///
31+ /// ```rust
32+ /// use std::future::Future;
33+ /// use std::sync::Arc;
34+ /// use std::task::{Context, Poll, Wake};
35+ /// use std::thread::{self, Thread};
36+ ///
37+ /// /// A waker that wakes up the current thread when called.
38+ /// struct ThreadWaker(Thread);
39+ ///
40+ /// impl Wake for ThreadWaker {
41+ /// fn wake(self: Arc<Self>) {
42+ /// self.0.unpark();
43+ /// }
44+ /// }
45+ ///
46+ /// /// Run a future to completion on the current thread.
47+ /// fn block_on<T>(fut: impl Future<Output = T>) -> T {
48+ /// // Pin the future so it can be polled.
49+ /// let mut fut = Box::pin(fut);
50+ ///
51+ /// // Create a new context to be passed to the future.
52+ /// let t = thread::current();
53+ /// let waker = Arc::new(ThreadWaker(t)).into();
54+ /// let mut cx = Context::from_waker(&waker);
55+ ///
56+ /// // Run the future to completion.
57+ /// loop {
58+ /// match fut.as_mut().poll(&mut cx) {
59+ /// Poll::Ready(res) => return res,
60+ /// Poll::Pending => thread::park(),
61+ /// }
62+ /// }
63+ /// }
64+ ///
65+ /// block_on(async {
66+ /// println!("Hi from inside a future!");
67+ /// });
68+ /// ```
69+ #[ stable( feature = "wake_trait" , since = "1.51.0" ) ]
2070pub trait Wake {
2171 /// Wake this task.
22- #[ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
72+ #[ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
2373 fn wake ( self : Arc < Self > ) ;
2474
2575 /// Wake this task without consuming the waker.
2676 ///
2777 /// If an executor supports a cheaper way to wake without consuming the
2878 /// waker, it should override this method. By default, it clones the
29- /// [`Arc`] and calls `wake` on the clone.
30- #[ unstable( feature = "wake_trait" , issue = "69912" ) ]
79+ /// [`Arc`] and calls [`wake`] on the clone.
80+ ///
81+ /// [`wake`]: Wake::wake
82+ #[ stable( feature = "wake_trait" , since = "1.51.0" ) ]
3183 fn wake_by_ref ( self : & Arc < Self > ) {
3284 self . clone ( ) . wake ( ) ;
3385 }
3486}
3587
3688#[ cfg_attr( bootstrap, allow( rustc:: ineffective_unstable_trait_impl) ) ]
3789#[ cfg_attr( not( bootstrap) , allow( ineffective_unstable_trait_impl) ) ]
38- #[ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
90+ #[ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
3991impl < W : Wake + Send + Sync + ' static > From < Arc < W > > for Waker {
4092 fn from ( waker : Arc < W > ) -> Waker {
4193 // SAFETY: This is safe because raw_waker safely constructs
@@ -46,7 +98,7 @@ impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for Waker {
4698
4799#[ cfg_attr( bootstrap, allow( rustc:: ineffective_unstable_trait_impl) ) ]
48100#[ cfg_attr( not( bootstrap) , allow( ineffective_unstable_trait_impl) ) ]
49- #[ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
101+ #[ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
50102impl < W : Wake + Send + Sync + ' static > From < Arc < W > > for RawWaker {
51103 fn from ( waker : Arc < W > ) -> RawWaker {
52104 raw_waker ( waker)
0 commit comments