-
-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(maitake): handle spurious
WaitCell
polls
This branch changes the `Wait` future for `maitake::sync::WaitCell` to handle spurious polls correctly. Currently, a `wait_cell::Wait` future assumes that if it's ever polled a second time, that means its waker was woken. However, there might be other reasons that a stack of futures containing a `Wait` is polled again, and the `Wait` future will incorrectly complete immediately in that case. This branch fixes this by replacing the `bool` field in `Wait` that's set on first poll with an "event count" stored in the remaining `WaitCell` state bits. Now, when a `Wait` is created, it loads the current event count, and calls to `wake()` and `close()` increment the event count. The `Wait` future then checks if the event count has gone up when it's polled, rather than just checking if it's ever been polled before. This allows the `Wait` future to determine if it is being polled because the `WaitCell` woke it up, or if it's being polled because some other future decided to poll it. This *also* has the side benefit of fixing racy scenarios where the `WaitCell` is woken between when the `Wait` future is created and when it's polled for the first time. Fixes #449
- Loading branch information
Showing
1 changed file
with
57 additions
and
13 deletions.
There are no files selected for viewing
This file contains 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