diff options
| author | SabrinaJewson <sejewson@gmail.com> | 2022-05-09 17:01:35 +0100 |
|---|---|---|
| committer | SabrinaJewson <sejewson@gmail.com> | 2022-05-09 17:13:01 +0100 |
| commit | b1f61ad74bb519bbe97aabfe9b2f04af9991d041 (patch) | |
| tree | 18ee0c799e9abc671186977c278d7a8a1f603f57 | |
| parent | e013f9e0ca4055930f931a30171c355de42f9f92 (diff) | |
| download | rust-b1f61ad74bb519bbe97aabfe9b2f04af9991d041.tar.gz rust-b1f61ad74bb519bbe97aabfe9b2f04af9991d041.zip | |
Add `task::Waker::noop`
| -rw-r--r-- | library/core/src/task/wake.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/library/core/src/task/wake.rs b/library/core/src/task/wake.rs index 27af227a1f2..bf36d3ba2d6 100644 --- a/library/core/src/task/wake.rs +++ b/library/core/src/task/wake.rs @@ -2,6 +2,7 @@ use crate::fmt; use crate::marker::{PhantomData, Unpin}; +use crate::ptr; /// A `RawWaker` allows the implementor of a task executor to create a [`Waker`] /// which provides customized wakeup behavior. @@ -277,6 +278,45 @@ impl Waker { Waker { waker } } + /// Creates a new `Waker` that does nothing when `wake` is called. + /// + /// This is mostly useful for writing tests that need a [`Context`] to poll + /// some futures, but are not expecting those futures to wake the waker or + /// do not need to do anything specific if it happens. + /// + /// # Examples + /// + /// ``` + /// #![feature(noop_waker)] + /// + /// use std::future::Future; + /// use std::task; + /// + /// let waker = task::Waker::noop(); + /// let mut cx = task::Context::from_waker(&waker); + /// + /// let mut future = Box::pin(async { 10 }); + /// assert_eq!(future.as_mut().poll(&mut cx), task::Poll::Ready(10)); + /// ``` + #[inline] + #[must_use] + #[unstable(feature = "noop_waker", issue = "none")] + pub const fn noop() -> Waker { + const VTABLE: RawWakerVTable = RawWakerVTable::new( + // Cloning just returns a new no-op raw waker + |_| RAW, + // `wake` does nothing + |_| {}, + // `wake_by_ref` does nothing + |_| {}, + // Dropping does nothing as we don't allocate anything + |_| {}, + ); + const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE); + + Waker { waker: RAW } + } + /// Get a reference to the underlying [`RawWaker`]. #[inline] #[must_use] |
