mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-06 00:00:10 +02:00
sync: fix missing notification during mpsc close (#2854)
When the mpsc channel receiver closes the channel, receiving should return `None` once all in-progress sends have completed. When a sender reserves capacity, this prevents the receiver from fully shutting down. Previously, when the sender, after reserving capacity, dropped without sending a message, the receiver was not notified. This results in blocking the shutdown process until all sender handles drop. This patch adds a receiver notification when the channel is both closed and all outstanding sends have completed.
This commit is contained in:
@@ -534,3 +534,25 @@ async fn blocking_send_async() {
|
||||
let (mut tx, _rx) = mpsc::channel::<()>(1);
|
||||
let _ = tx.blocking_send(());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ready_close_cancel_bounded() {
|
||||
use futures::future::poll_fn;
|
||||
|
||||
let (mut tx, mut rx) = mpsc::channel::<()>(100);
|
||||
let _tx2 = tx.clone();
|
||||
|
||||
{
|
||||
let mut ready = task::spawn(async { poll_fn(|cx| tx.poll_ready(cx)).await });
|
||||
assert_ready_ok!(ready.poll());
|
||||
}
|
||||
|
||||
rx.close();
|
||||
|
||||
let mut recv = task::spawn(async { rx.recv().await });
|
||||
assert_pending!(recv.poll());
|
||||
|
||||
drop(tx);
|
||||
|
||||
assert!(recv.is_woken());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user