xpc: replace synchronous daemon calls with async completion-block API - #878
Open
litemars wants to merge 1 commit into
Open
xpc: replace synchronous daemon calls with async completion-block API#878litemars wants to merge 1 commit into
litemars wants to merge 1 commit into
Conversation
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.
Problem
Every call from the App to the daemon was made through
synchronousRemoteObjectProxyWithErrorHandler:, which blocks the calling thread until the daemon replies. Because most of these calls originated on the main thread (menu actions, window lifecycle hooks, table-view delegates, preference toggles), any latency on the XPC channel — daemon busy, system under load, brief IPC hiccup — would freeze the entire UI for the duration of the wait. This included interactive operations that users trigger deliberately (opening the Rules window, switching profiles, importing rules, exporting rules, toggling the firewall), all of which silently stalled the run loop.The 14 methods in
XPCDaemonClientthat used synchronous proxies:getPreferences, updatePreferences, getRules, importRules: userOnly, cleanupRules, getCurrentProfile, getProfiles, setProfile, addProfile:preferences, deleteProfile, uninstall
Solution
Replace every synchronous proxy call with
remoteObjectProxyWithErrorHandler:and propagate results through completion blocks. Callers perform any subsequent UI work viadispatch_async(dispatch_get_main_queue(), …)inside those blocks.The three purely fire-and-forget methods (
addRule:,toggleRule:uuid:state:,deleteRule:uuid:) already used void returns and required no change.