fix(DSM): Use async-signal-safe mutex in SIGSEGV handler#9893
Open
adambratschikaye wants to merge 2 commits intomasterfrom
Open
fix(DSM): Use async-signal-safe mutex in SIGSEGV handler#9893adambratschikaye wants to merge 2 commits intomasterfrom
adambratschikaye wants to merge 2 commits intomasterfrom
Conversation
std::sync::Mutex uses pthread_mutex_lock internally, which is not async-signal-safe. The SIGSEGV handler acquires two mutexes during execution: the SigsegvMemoryTracker lock and the subtract_instruction_counter lock. If the main thread holds either of these when a page fault fires, the handler will call pthread_mutex_lock re-entrantly on the same thread, which is undefined behaviour and can deadlock the process. Introduce SignalMutex, a thin wrapper around an AtomicBool that uses compare_exchange (Acquire/Relaxed) to take the lock and a Release store to release it. All three operations are async-signal-safe. If the flag is already set when the handler tries to acquire it, SignalMutex panics immediately rather than blocking, turning a silent hang into a loud crash that is easier to diagnose.
e40c52f to
b18c648
Compare
michael-weigelt
approved these changes
Apr 15, 2026
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.
std::sync::Mutex uses pthread_mutex_lock internally, which is not async-signal-safe. The SIGSEGV handler acquires two mutexes during execution: the SigsegvMemoryTracker lock and the
subtract_instruction_counter lock. If the main thread holds either of these when a page fault fires, the handler will call pthread_mutex_lock re-entrantly on the same thread, which is undefined behaviour and can deadlock the process.
Introduce SignalMutex, a thin wrapper around an AtomicBool that uses compare_exchange (Acquire/Relaxed) to take the lock and a Release store to release it. All three operations are async-signal-safe. If the flag is already set when the handler tries to acquire it, SignalMutex panics immediately rather than blocking, turning a silent hang into a loud crash that is easier to diagnose.