-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Improve bounded mpsc documentation #3458
Conversation
/// Note that if [`close`] is called, but there are still outstanding | ||
/// [`Permits`] from before it was closed, the channel is not considered | ||
/// closed by `recv` until the permits are released. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is tested by
tokio/tokio/tests/sync_mpsc.rs
Lines 275 to 301 in 672be92
#[tokio::test] | |
async fn recv_close_gets_none_reserved() { | |
let (tx1, mut rx) = mpsc::channel::<i32>(1); | |
let tx2 = tx1.clone(); | |
let permit1 = assert_ok!(tx1.reserve().await); | |
let mut permit2 = task::spawn(tx2.reserve()); | |
assert_pending!(permit2.poll()); | |
rx.close(); | |
assert!(permit2.is_woken()); | |
assert_ready_err!(permit2.poll()); | |
{ | |
let mut recv = task::spawn(rx.recv()); | |
assert_pending!(recv.poll()); | |
permit1.send(123); | |
assert!(recv.is_woken()); | |
let v = assert_ready!(recv.poll()); | |
assert_eq!(v, Some(123)); | |
} | |
assert!(rx.recv().await.is_none()); | |
} |
/// This method is intended for use cases where you are sending from | ||
/// asynchronous code to synchronous code, and will work even if the sender | ||
/// is not using [`blocking_send`] to send the message. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This particular note is what inspired this PR, since whether the channels works when one end is sync and the other is async is a surprisingly common question.
/// closed when all senders have been dropped, or when [`close`] is called. | ||
/// | ||
/// If there are no messages in the channel's buffer, but the channel has | ||
/// not yet been closed, this method will sleep until a message is sent or |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
sleep feels weird here but I can't think of anything better.
This clarifies various things in the documentation for bounded mpsc channels.