Extract fork-safe mutex into ForkSafeMutex - #1035
Open
jnunemaker wants to merge 1 commit into
Open
Conversation
The Memory adapter and Poller each carried their own copy of the fork-detection dance: track the PID, and on first use in a forked child, unlock the inherited-but-stale mutex before locking. Unlocking a mutex held by a thread that no longer exists after fork risks ThreadError. Replace both with a shared ForkSafeMutex that atomically swaps in a fresh mutex on first use in a new process instead of unlocking a stale one. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
Memoryadapter andPollereach duplicated the same fork-detection dance: track the PID and, on first use in a forked child, unlock the inherited-but-stale mutex before locking it — which risks aThreadErrorsince the mutex may be held by a thread that no longer exists after fork.This extracts a shared
Flipper::ForkSafeMutexthat atomically swaps in a fresh mutex on first use in a new process (via anAtomicReference+ compare-and-set) instead of unlocking a stale one. BothMemoryandPollernow delegate to it, andPoller#startuses the reset's return value to clear@shutdown_requestedon fork. Added specs for the mutex, the memory adapter, and the poller cover the post-fork swap and the reset race.🤖 Generated with Claude Code