4.x: Improve and fix CompositeDisposable #505
Merged
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 PR cleans up the internal logic of
CompositeDisposable
by avoiding some allocations and making sure publicly visible state is available in a thread-safe manner.The main safety offender was the
IsDisposed
reading the_disposed
plain field without a barrier. Assuming the .NET memory modell is compatible with the C++ 11/Java memory model, such reads could be cached and the reader may never see_disposed
turn true:without a barrier, this could end up like this:
and never complete.