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