Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #898.
Motivation
Basically #898. Also needed for tower-rs/tower#408.
Since
poll_ready
takes up one of the finite number of slots in a bounded channel, callers need to send an item shortly afterpoll_ready
succeeds. If they do not, idle senders may take up all the slots of the channel, and prevent active senders from getting any requests through. Consider this code that forwards from one channel to another:If many such forwarders exist, and they all forward into a single (cloned)
Sender
, then any number of forwarders may be waiting forrx.poll_recv
at the same time. While they do, they are effectively each reducing the channel's capacity by 1. If enough of these forwarders are idle, forwarders whoserx
do have elements will be unable to find a spot for them throughpoll_ready
, and the system will deadlock.Solution
disarm
solves this problem by allowing you to give up the reserved slot if you find that you have to block. We can then fix the code above by writing: