Make sure each invocation of block_on uses its own Parker #358
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?