diff --git a/tokio/src/sync/notify.rs b/tokio/src/sync/notify.rs index 33bce0e4f66..68418c0c9f2 100644 --- a/tokio/src/sync/notify.rs +++ b/tokio/src/sync/notify.rs @@ -1118,6 +1118,11 @@ impl NotifiedProject<'_> { State::Init => { let curr = notify.state.load(SeqCst); + if get_num_notify_waiters_calls(curr) != *notify_waiters_calls { + *state = State::Done; + continue 'outer_loop; + } + // Optimistically try acquiring a pending notification let res = notify.state.compare_exchange( set_state(curr, NOTIFIED), diff --git a/tokio/tests/sync_notify.rs b/tokio/tests/sync_notify.rs index 13b3f921e98..9f8186794ea 100644 --- a/tokio/tests/sync_notify.rs +++ b/tokio/tests/sync_notify.rs @@ -301,3 +301,15 @@ fn test_waker_update() { assert!(future.is_woken()); } + +#[test] +fn notify_one_has_priority_over_notify_waiters() { + use futures::FutureExt; + let notify = tokio::sync::Notify::new(); + let notified1 = notify.notified(); + notify.notify_waiters(); + notify.notify_one(); + assert!(notified1.now_or_never().is_some()); + let notified2 = notify.notified(); + assert!(notified2.now_or_never().is_some()); +}