Fix rare cases of corrupt feature flags in NDK reports #1801
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.
Goal
Avoid reporting feature flags that were corrupted by being modified when a native crash was in progress.
Design
Added a new spin lock structure similar to a sequence-lock to protect the NDK-side feature flags. When altering feature flags its counter value will be odd (strictly
(counter & 1) != 0
) and when no changes are taking place the value will be even (strictly(counter & 1) == 0
).The signal handler takes a snapshot of the counter before and after writing the feature flags to the event dump. These two values are compared and a "verification" flag of one byte is written. If this value is zero (invalid) when loading the feature flags, all feature flags for the event are discarded (as they will have been corrupted).
This approach avoids the signal handler possibly having to wait on the lock, and avoids deadlocks.
Testing
Re-tested using a local saturation test.