Fix Effect.throttle data races and scheduler value return
#669
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.
The
Effect.throttleoperator had multiple data races when updatingthrottleTimesandthrottleValuesshared state, because:Effect.throttlecan be called from any scheduler.flatMapruns on the current chain scheduler, but the throttled (delayed) value runs on the passed inschedulerparameter (which can be different).By protecting shared state with a lock (similar to the cancellables'), these data races should be addressed.
Additionally, the
Effect.throttleshould return all values in theschedulerpassed in, so that the API contract is honored and values come from where callers expect them to.Changes
Add new
throttleLockrecursive lock to protectthrottleTimesandthrottleValuesshared state inEffect.throttle` operator.Ensure all values in
Effect.throttlecome from the passed inscheduler.