Fix for select read+write and spurious wakeup #552
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.
Addresses #551
The green select function relies on removing the listeners in the "finally" block to ensure that no other callbacks will be issued. But in some hubs (poll and epolls, but not selects), callbacks are queued up in a local variable (called "callbacks"), so will not be prevented even if we remove the corresponding listeners. So in the case where both read and write are applicable, one of those callbacks gets issued after the select call returns, causing a spurious wakeup.
This addresses the issue by scheduling another callback to call current.switch, so that Hub.wait has a chance to finish issuing all callbacks.
This also has the benefit that select will now return both the read and write flags if they both apply, which is more consistent with the behavior of the original select function.