Make sure each invocation of block_on uses its own Parker#358
Merged
1 commit merged intomasterfrom Oct 17, 2019
unknown repository
Merged
Make sure each invocation of block_on uses its own Parker#3581 commit merged intomasterfrom unknown repository
1 commit merged intomasterfrom
unknown repository
Conversation
|
Yes, this branch does appear to fix the deadlock I observed. |
|
Yes, I can confirm that it resolves the issue I had. Great work, as usual! |
yoshuawuyts
approved these changes
Oct 17, 2019
This pull request was closed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
This fixes a bug where we have recursive (nested) invocations of
block_on:Each
block_onbehaves as an independent task and has an associated waker.The problem was that both of these
block_oninvocations reused the sameThreaddescriptor for wakeups. If someone called.wake(), we had no way of distinguishing which of the twoblock_ontasks was actually woken.Sometimes the outer task should get woken but the inner task would pick up the wakeup because it took over the
Threaddescriptor.The problem is solved by associating a distinct
Parkerwith eachblock_oninvocation so that they don't get shared among recursive calls. Note that aParkeris just an implementation ofstd::thread::park()andstd::thread::unpark(), except it was extracted out and moved intocrossbeam-utils.This should fix deadlocks @svartalf and @jebrosen have reported this week. Can you perhaps confirm the problem goes away with this branch?