sync: return Empty from try_recv() when mpsc is closed with outstanding permits (#8074)

This commit is contained in:
Alice Ryhl
2026-05-07 09:30:50 +02:00
committed by GitHub
parent ebf61b45b5
commit 9fccf5339d
2 changed files with 16 additions and 1 deletions
+3 -1
View File
@@ -436,7 +436,9 @@ impl<T, S: Semaphore> Rx<T, S> {
}
TryPopResult::Closed => return Err(TryRecvError::Disconnected),
// If close() was called, an empty queue should report Disconnected.
TryPopResult::Empty if rx_fields.rx_closed => {
TryPopResult::Empty
if rx_fields.rx_closed && self.inner.semaphore.is_idle() =>
{
return Err(TryRecvError::Disconnected)
}
TryPopResult::Empty => return Err(TryRecvError::Empty),
+13
View File
@@ -999,6 +999,19 @@ fn try_recv_after_receiver_close() {
assert_eq!(Err(TryRecvError::Disconnected), rx.try_recv());
}
#[test]
fn try_recv_after_receiver_close_with_permit() {
let (tx, mut rx) = mpsc::channel::<()>(5);
let permit = tx.try_reserve().unwrap();
assert_eq!(Err(TryRecvError::Empty), rx.try_recv());
rx.close();
assert_eq!(Err(TryRecvError::Empty), rx.try_recv());
drop(permit);
assert_eq!(Err(TryRecvError::Disconnected), rx.try_recv());
}
#[test]
fn try_recv_close_while_empty_bounded() {
let (tx, mut rx) = mpsc::channel::<()>(5);