Skip to content

Commit e8e1fb1

Browse files
committed
Turn unstable Waker::noop() into Waker::NOOP.
The advantage of this is that `&Waker::NOOP` can live for '`static`, so it does not need to be assigned to a variable to be used in a `Context` creation, which is, as shown in the changes to the tests in this commit, is the most common thing to want to do with a noop waker. An alternative would be to make it be of type `&'static Waker`, which would make that common case even shorter, but that would mean that if an owned `Waker` is desired it must be `.clone()`d from the constant. Or, both versions could be provided, like `futures::task::noop_waker()` and `futures::task::noop_waker_ref()`. But either option seems less elegant to me. Previous discussion on the tracking issue starting here: rust-lang#98286 (comment)
1 parent 3deb9bb commit e8e1fb1

22 files changed

+26
-51
lines changed

library/core/src/task/wake.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ impl Waker {
329329
Waker { waker }
330330
}
331331

332-
/// Creates a new `Waker` that does nothing when `wake` is called.
332+
/// A `Waker` that does nothing when its `wake()` is called.
333333
///
334334
/// This is mostly useful for writing tests that need a [`Context`] to poll
335335
/// some futures, but are not expecting those futures to wake the waker or
@@ -343,16 +343,13 @@ impl Waker {
343343
/// use std::future::Future;
344344
/// use std::task;
345345
///
346-
/// let waker = task::Waker::noop();
347-
/// let mut cx = task::Context::from_waker(&waker);
346+
/// let mut cx = task::Context::from_waker(&task::Waker::NOOP);
348347
///
349348
/// let mut future = Box::pin(async { 10 });
350349
/// assert_eq!(future.as_mut().poll(&mut cx), task::Poll::Ready(10));
351350
/// ```
352-
#[inline]
353-
#[must_use]
354351
#[unstable(feature = "noop_waker", issue = "98286")]
355-
pub const fn noop() -> Waker {
352+
pub const NOOP: Waker = {
356353
const VTABLE: RawWakerVTable = RawWakerVTable::new(
357354
// Cloning just returns a new no-op raw waker
358355
|_| RAW,
@@ -366,7 +363,7 @@ impl Waker {
366363
const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE);
367364

368365
Waker { waker: RAW }
369-
}
366+
};
370367

371368
/// Get a reference to the underlying [`RawWaker`].
372369
#[inline]

library/core/tests/async_iter/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ fn into_async_iter() {
77
let async_iter = async_iter::from_iter(0..3);
88
let mut async_iter = pin!(async_iter.into_async_iter());
99

10-
let waker = core::task::Waker::noop();
11-
let mut cx = &mut core::task::Context::from_waker(&waker);
10+
let mut cx = &mut core::task::Context::from_waker(&core::task::Waker::NOOP);
1211

1312
assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(Some(0)));
1413
assert_eq!(async_iter.as_mut().poll_next(&mut cx), Poll::Ready(Some(1)));

src/tools/miri/tests/pass/async-fn.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ async fn uninhabited_variant() {
7676
fn run_fut<T>(fut: impl Future<Output = T>) -> T {
7777
use std::task::{Context, Poll, Waker};
7878

79-
let waker = Waker::noop();
80-
let mut context = Context::from_waker(&waker);
79+
let mut context = Context::from_waker(&Waker::NOOP);
8180

8281
let mut pinned = Box::pin(fut);
8382
loop {

src/tools/miri/tests/pass/dyn-star.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ fn dispatch_on_pin_mut() {
9393
let mut fut = async_main();
9494

9595
// Poll loop, just to test the future...
96-
let waker = Waker::noop();
97-
let ctx = &mut Context::from_waker(&waker);
96+
let ctx = &mut Context::from_waker(&Waker::NOOP);
9897

9998
loop {
10099
match unsafe { Pin::new_unchecked(&mut fut).poll(ctx) } {

src/tools/miri/tests/pass/future-self-referential.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,7 @@ impl Future for DoStuff {
7777
}
7878

7979
fn run_fut<T>(fut: impl Future<Output = T>) -> T {
80-
let waker = Waker::noop();
81-
let mut context = Context::from_waker(&waker);
80+
let mut context = Context::from_waker(&Waker::NOOP);
8281

8382
let mut pinned = pin!(fut);
8483
loop {
@@ -90,8 +89,7 @@ fn run_fut<T>(fut: impl Future<Output = T>) -> T {
9089
}
9190

9291
fn self_referential_box() {
93-
let waker = Waker::noop();
94-
let cx = &mut Context::from_waker(&waker);
92+
let cx = &mut Context::from_waker(&Waker::NOOP);
9593

9694
async fn my_fut() -> i32 {
9795
let val = 10;

src/tools/miri/tests/pass/issues/issue-miri-2068.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ use std::task::{Context, Poll, Waker};
66

77
pub fn fuzzing_block_on<O, F: Future<Output = O>>(fut: F) -> O {
88
let mut fut = std::pin::pin!(fut);
9-
let waker = Waker::noop();
10-
let mut context = Context::from_waker(&waker);
9+
let mut context = Context::from_waker(&Waker::NOOP);
1110
loop {
1211
match fut.as_mut().poll(&mut context) {
1312
Poll::Ready(v) => return v,

src/tools/miri/tests/pass/move-data-across-await-point.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ fn data_moved() {
5656
fn run_fut<T>(fut: impl Future<Output = T>) -> T {
5757
use std::task::{Context, Poll, Waker};
5858

59-
let waker = Waker::noop();
60-
let mut context = Context::from_waker(&waker);
59+
let mut context = Context::from_waker(&Waker::NOOP);
6160

6261
let mut pinned = Box::pin(fut);
6362
loop {

tests/coverage/async.coverage

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@
117117
LL| | #[coverage(off)]
118118
LL| | pub fn block_on<F: Future>(mut future: F) -> F::Output {
119119
LL| | let mut future = pin!(future);
120-
LL| | let waker = Waker::noop();
121-
LL| | let mut context = Context::from_waker(&waker);
120+
LL| | let mut context = Context::from_waker(&Waker::NOOP);
122121
LL| |
123122
LL| | loop {
124123
LL| | if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/async.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,7 @@ mod executor {
110110
#[coverage(off)]
111111
pub fn block_on<F: Future>(mut future: F) -> F::Output {
112112
let mut future = pin!(future);
113-
let waker = Waker::noop();
114-
let mut context = Context::from_waker(&waker);
113+
let mut context = Context::from_waker(&Waker::NOOP);
115114

116115
loop {
117116
if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/async2.coverage

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@
4141
LL| | #[coverage(off)]
4242
LL| | pub fn block_on<F: Future>(mut future: F) -> F::Output {
4343
LL| | let mut future = pin!(future);
44-
LL| | let waker = Waker::noop();
45-
LL| | let mut context = Context::from_waker(&waker);
44+
LL| | let mut context = Context::from_waker(&Waker::NOOP);
4645
LL| |
4746
LL| | loop {
4847
LL| | if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/async2.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ mod executor {
3939
#[coverage(off)]
4040
pub fn block_on<F: Future>(mut future: F) -> F::Output {
4141
let mut future = pin!(future);
42-
let waker = Waker::noop();
43-
let mut context = Context::from_waker(&waker);
42+
let mut context = Context::from_waker(&Waker::NOOP);
4443

4544
loop {
4645
if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/async_block.coverage

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
LL| | #[coverage(off)]
2525
LL| | pub fn block_on<F: Future>(mut future: F) -> F::Output {
2626
LL| | let mut future = pin!(future);
27-
LL| | let waker = Waker::noop();
28-
LL| | let mut context = Context::from_waker(&waker);
27+
LL| | let mut context = Context::from_waker(&Waker::NOOP);
2928
LL| |
3029
LL| | loop {
3130
LL| | if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/async_block.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ mod executor {
2323
#[coverage(off)]
2424
pub fn block_on<F: Future>(mut future: F) -> F::Output {
2525
let mut future = pin!(future);
26-
let waker = Waker::noop();
27-
let mut context = Context::from_waker(&waker);
26+
let mut context = Context::from_waker(&Waker::NOOP);
2827

2928
loop {
3029
if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/closure_macro_async.coverage

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@
5454
LL| | #[coverage(off)]
5555
LL| | pub fn block_on<F: Future>(mut future: F) -> F::Output {
5656
LL| | let mut future = pin!(future);
57-
LL| | let waker = Waker::noop();
58-
LL| | let mut context = Context::from_waker(&waker);
57+
LL| | let mut context = Context::from_waker(&Waker::NOOP);
5958
LL| |
6059
LL| | loop {
6160
LL| | if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/coverage/closure_macro_async.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ mod executor {
5353
#[coverage(off)]
5454
pub fn block_on<F: Future>(mut future: F) -> F::Output {
5555
let mut future = pin!(future);
56-
let waker = Waker::noop();
57-
let mut context = Context::from_waker(&waker);
56+
let mut context = Context::from_waker(&Waker::NOOP);
5857

5958
loop {
6059
if let Poll::Ready(val) = future.as_mut().poll(&mut context) {

tests/ui/async-await/for-await-passthrough.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ async fn real_main() {
2525

2626
fn main() {
2727
let future = real_main();
28-
let waker = std::task::Waker::noop();
29-
let mut cx = &mut core::task::Context::from_waker(&waker);
28+
let mut cx = &mut core::task::Context::from_waker(&std::task::Waker::NOOP);
3029
let mut future = core::pin::pin!(future);
3130
while let core::task::Poll::Pending = future.as_mut().poll(&mut cx) {}
3231
}

tests/ui/async-await/for-await.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ async fn real_main() {
1717

1818
fn main() {
1919
let future = real_main();
20-
let waker = std::task::Waker::noop();
21-
let mut cx = &mut core::task::Context::from_waker(&waker);
20+
let mut cx = &mut core::task::Context::from_waker(&std::task::Waker::NOOP);
2221
let mut future = core::pin::pin!(future);
2322
while let core::task::Poll::Pending = future.as_mut().poll(&mut cx) {}
2423
}

tests/ui/async-await/in-trait/async-default-fn-overridden.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ fn main() {
4040
let mut fut = pin!(async_main());
4141

4242
// Poll loop, just to test the future...
43-
let waker = Waker::noop();
44-
let ctx = &mut Context::from_waker(&waker);
43+
let ctx = &mut Context::from_waker(&Waker::NOOP);
4544

4645
loop {
4746
match fut.as_mut().poll(ctx) {

tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ fn main() {
4343
let mut fut = pin!(async_main());
4444

4545
// Poll loop, just to test the future...
46-
let waker = Waker::noop();
47-
let ctx = &mut Context::from_waker(&waker);
46+
let ctx = &mut Context::from_waker(&Waker::NOOP);
4847

4948
loop {
5049
match fut.as_mut().poll(ctx) {

tests/ui/coroutine/async-gen-yield-ty-is-unit.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ async gen fn gen_fn() -> &'static str {
1111

1212
pub fn main() {
1313
let async_iterator = pin!(gen_fn());
14-
let waker = Waker::noop();
15-
let ctx = &mut Context::from_waker(&waker);
14+
let ctx = &mut Context::from_waker(&Waker::NOOP);
1615
async_iterator.poll_next(ctx);
1716
}

tests/ui/coroutine/async_gen_fn_iter.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,7 @@ fn main() {
7474
let mut fut = pin!(async_main());
7575

7676
// Poll loop, just to test the future...
77-
let waker = Waker::noop();
78-
let ctx = &mut Context::from_waker(&waker);
77+
let ctx = &mut Context::from_waker(&Waker::NOOP);
7978

8079
loop {
8180
match fut.as_mut().poll(ctx) {

tests/ui/dyn-star/dispatch-on-pin-mut.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ fn main() {
2626
let mut fut = pin!(async_main());
2727

2828
// Poll loop, just to test the future...
29-
let waker = Waker::noop();
30-
let ctx = &mut Context::from_waker(&waker);
29+
let ctx = &mut Context::from_waker(&Waker::NOOP);
3130

3231
loop {
3332
match fut.as_mut().poll(ctx) {

0 commit comments

Comments
 (0)