sync: fix panic in broadcast::Receiver drop #3434
Merged
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.
Motivation
Fixes: #2533
I came across this problem in my program with multiple worker threads and an insufficient channel capacity. With a debugger, I noticed that
self.next
can be set a greater value thanuntil
byself.recv_ref()
when it's called multiple times in the loop in drop.Here is another program that reproduces the panic:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=d09c0b70aeb7187b87a01db544c6b821
Solution
self.recv_ref
whenself.next
is smaller thanuntil
.