From da292dfb66ef34fdfbb6aa1f23c3b2456ca4d400 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) (cherry picked from commit 6d1ae6286880c828c13efb5f11b60c18fb94f947) --- tokio/src/sync/broadcast.rs | 2 +- tokio/tests/sync_broadcast.rs | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tokio/src/sync/broadcast.rs b/tokio/src/sync/broadcast.rs index b48493be2..a69eca661 100644 --- a/tokio/src/sync/broadcast.rs +++ b/tokio/src/sync/broadcast.rs @@ -522,7 +522,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 3af96bdb5..d485c6307 100644 --- a/tokio/tests/sync_broadcast.rs +++ b/tokio/tests/sync_broadcast.rs @@ -656,3 +656,15 @@ async fn receiver_recv_is_cooperative() { _ = tokio::task::yield_now() => {}, } } + +#[tokio::test] +async fn broadcast_sender_new_must_be_closed() { + let capacity = 1; + let tx: broadcast::Sender<()> = broadcast::Sender::new(capacity); + + tx.send(()).unwrap_err(); + + let _rx = tx.subscribe(); + + tx.send(()).unwrap(); +}