Skip to content

Guard ServiceBrowser channels against post-Free dispatch and blocking sends#2

Open
kirollosnct wants to merge 2 commits into
devfrom
fix/channel-deadlock
Open

Guard ServiceBrowser channels against post-Free dispatch and blocking sends#2
kirollosnct wants to merge 2 commits into
devfrom
fix/channel-deadlock

Conversation

@kirollosnct

Copy link
Copy Markdown
Member

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:

  • 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 PR depends on #1

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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants