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_on
behaves as an independent task and has an associated waker.The problem was that both of these
block_on
invocations reused the sameThread
descriptor for wakeups. If someone called.wake()
, we had no way of distinguishing which of the twoblock_on
tasks was actually woken.Sometimes the outer task should get woken but the inner task would pick up the wakeup because it took over the
Thread
descriptor.The problem is solved by associating a distinct
Parker
with eachblock_on
invocation so that they don't get shared among recursive calls. Note that aParker
is 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?