Guard ServiceBrowser channels against post-Free dispatch and blocking sends#2
Open
kirollosnct wants to merge 2 commits into
Open
Guard ServiceBrowser channels against post-Free dispatch and blocking sends#2kirollosnct wants to merge 2 commits into
kirollosnct wants to merge 2 commits into
Conversation
SystemBus() returns a process-wide shared connection, so closing it in one Server's Shutdown() would break every other Server in the same process. Switch to SystemBusPrivate() with explicit Auth() and Hello() so each Server owns its connection lifecycle independently.
… sends
handleSignals now dispatches outside c.mutex (snapshot-then-release), so
a ServiceBrowser can be Free'd between the snapshot and the dispatch.
Two consequences fixed here:
- Free() nils addChannel/removeChannel under a new per-browser mutex
before the D-Bus Free call, so an in-flight DispatchSignal sees nil
and skips the send instead of touching a channel the caller has
discarded.
- DispatchSignal reads the channel pointers under the same mutex and
sends with a non-blocking select. A stalled or slow receiver can no
longer pin the dispatcher goroutine, which previously contributed
to a c.mutex / a.mux / channel-send deadlock cycle.
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.
Guard ServiceBrowser channels against post-Free dispatch and blocking sends
handleSignals now dispatches outside c.mutex (snapshot-then-release), so
a ServiceBrowser can be Free'd between the snapshot and the dispatch.
Two consequences fixed here:
before the D-Bus Free call, so an in-flight DispatchSignal sees nil
and skips the send instead of touching a channel the caller has
discarded.
sends with a non-blocking select. A stalled or slow receiver can no
longer pin the dispatcher goroutine, which previously contributed
to a c.mutex / a.mux / channel-send deadlock cycle.
This PR depends on #1