Auto merge of #96875 - SabrinaJewson:noop-waker, r=m-ou-se
Add `task::Waker::noop` I have found myself reimplementing this function many times when I need a `Context` but don't have a runtime or `futures` to hand. Prior art: [`futures::task::noop_waker`](https://docs.rs/futures/0.3/futures/task/fn.noop_waker.html) and [`futures::task::noop_waker_ref`](https://docs.rs/futures/0.3/futures/task/fn.noop_waker_ref.html) Tracking issue: https://github.com/rust-lang/rust/issues/98286 Unresolved questions: 1. Should we also add `RawWaker::noop()`? (I don't think so, I can't think of a use case for it) 2. Should we also add `Context::noop()`? Depending on the future direction `Context` goes a "noop context" might not even make sense in future. 3. Should it be an associated constant instead? That would allow for `let cx = &mut Context::from_waker(&Waker::NOOP);` to work on one line which is pretty nice. I don't really know what the guideline is here. r? rust-lang/libs-api `@rustbot` label +T-libs-api -T-libs
This commit is contained in:
commit
10b7e468f3
1 changed files with 40 additions and 0 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
use crate::fmt;
|
use crate::fmt;
|
||||||
use crate::marker::{PhantomData, Unpin};
|
use crate::marker::{PhantomData, Unpin};
|
||||||
|
use crate::ptr;
|
||||||
|
|
||||||
/// A `RawWaker` allows the implementor of a task executor to create a [`Waker`]
|
/// A `RawWaker` allows the implementor of a task executor to create a [`Waker`]
|
||||||
/// which provides customized wakeup behavior.
|
/// which provides customized wakeup behavior.
|
||||||
|
@ -322,6 +323,45 @@ impl Waker {
|
||||||
Waker { 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 = "98286")]
|
||||||
|
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`].
|
/// Get a reference to the underlying [`RawWaker`].
|
||||||
#[inline]
|
#[inline]
|
||||||
#[must_use]
|
#[must_use]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue