1
- #![ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
1
+ #![ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
2
2
//! Types and Traits for working with asynchronous tasks.
3
3
use core:: mem:: ManuallyDrop ;
4
4
use core:: task:: { RawWaker , RawWakerVTable , Waker } ;
@@ -16,26 +16,78 @@ use crate::sync::Arc;
16
16
/// to wake up a task is stored in an [`Arc`]. Some executors (especially
17
17
/// those for embedded systems) cannot use this API, which is why [`RawWaker`]
18
18
/// 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" ) ]
20
70
pub trait Wake {
21
71
/// Wake this task.
22
- #[ unstable ( feature = "wake_trait" , issue = "69912 " ) ]
72
+ #[ stable ( feature = "wake_trait" , since = "1.51.0 " ) ]
23
73
fn wake ( self : Arc < Self > ) ;
24
74
25
75
/// Wake this task without consuming the waker.
26
76
///
27
77
/// If an executor supports a cheaper way to wake without consuming the
28
78
/// 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" ) ]
31
83
fn wake_by_ref ( self : & Arc < Self > ) {
32
84
self . clone ( ) . wake ( ) ;
33
85
}
34
86
}
35
87
36
88
#[ cfg_attr( bootstrap, allow( rustc:: ineffective_unstable_trait_impl) ) ]
37
89
#[ 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 " ) ]
39
91
impl < W : Wake + Send + Sync + ' static > From < Arc < W > > for Waker {
40
92
fn from ( waker : Arc < W > ) -> Waker {
41
93
// SAFETY: This is safe because raw_waker safely constructs
@@ -46,7 +98,7 @@ impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for Waker {
46
98
47
99
#[ cfg_attr( bootstrap, allow( rustc:: ineffective_unstable_trait_impl) ) ]
48
100
#[ 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 " ) ]
50
102
impl < W : Wake + Send + Sync + ' static > From < Arc < W > > for RawWaker {
51
103
fn from ( waker : Arc < W > ) -> RawWaker {
52
104
raw_waker ( waker)
0 commit comments