Fix waker behavior when invoked before a poll
finishes
#54
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.
It's possible for a task's waker to be invoked in the middle of a call
to that task's
poll
by the executor. We had accounted for thatpossibility if the task called its own waker, but that's not good
enough: the waker can escape to other threads that can invoke it before
poll
finishes (e.g., if the task blocks to acquire a lock).This change fixes the waker behavior by clarifying the semantics of a
call to
wake
: a task whose waker is invoked should not be blockedwhen it next returns Pending to the executor, and should be woken if
that has already happened. To do this, we introduce a new
Sleeping
state for tasks, that has the same semantics as
Blocked
but that isrecognized by waker invocations, which will only unblock a task in
Sleeping
state. This also removes the special case "woken by self"behavior -- being woken by any thread should be enough to trigger this
sleep logic.
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.