From 6d1ae6286880c828c13efb5f11b60c18fb94f947 Mon Sep 17 00:00:00 2001 From: Martin Grigorov Date: Sat, 20 Sep 2025 09:44:55 +0300 Subject: [PATCH] sync: close the `broadcast::Sender` in `broadcast::Sender::new()` (#7629) --- tokio/src/sync/broadcast.rs | 2 +- tokio/tests/sync_broadcast.rs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tokio/src/sync/broadcast.rs b/tokio/src/sync/broadcast.rs index b21c3d0e5..cf1ae6cc8 100644 --- a/tokio/src/sync/broadcast.rs +++ b/tokio/src/sync/broadcast.rs @@ -566,7 +566,7 @@ impl Sender { tail: Mutex::new(Tail { pos: 0, rx_cnt: receiver_count, - closed: false, + closed: receiver_count == 0, waiters: LinkedList::new(), }), num_tx: AtomicUsize::new(1), diff --git a/tokio/tests/sync_broadcast.rs b/tokio/tests/sync_broadcast.rs index 0d657ff77..b742a6f61 100644 --- a/tokio/tests/sync_broadcast.rs +++ b/tokio/tests/sync_broadcast.rs @@ -706,3 +706,17 @@ fn broadcast_sender_closed_with_extra_subscribe() { assert!(task3.is_woken()); assert_ready!(task3.poll()); } + +#[tokio::test] +async fn broadcast_sender_new_must_be_closed() { + let capacity = 1; + let tx: broadcast::Sender<()> = broadcast::Sender::new(capacity); + + let mut task = task::spawn(tx.closed()); + assert_ready!(task.poll()); + + let _rx = tx.subscribe(); + + let mut task2 = task::spawn(tx.closed()); + assert_pending!(task2.poll()); +}