From 025c709e94a3f199fc0ff953c0b1290f5b6fb499 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Mon, 20 Jul 2026 19:21:27 -0700 Subject: [PATCH] ipc: wait for remote process to exit before returning from kill --- changelog/next.md | 1 + src/ipc/ipc.cpp | 14 +++++++++++--- src/ipc/ipc.hpp | 5 ++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/changelog/next.md b/changelog/next.md index 585dfb6..2b8215a 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -10,3 +10,4 @@ - Fixed crashes from accessing freed objects laundered through a `ScriptModel`. - Fixed crashes when a wifi network disappear. - Fixed unhandled notifications sending `NotificationClosed` out of order. +- Fixed `qs kill` not waiting for the process to exit. diff --git a/src/ipc/ipc.cpp b/src/ipc/ipc.cpp index 4bfea4c..9a47c50 100644 --- a/src/ipc/ipc.cpp +++ b/src/ipc/ipc.cpp @@ -105,11 +105,19 @@ IpcClient::IpcClient(const QString& path) { bool IpcClient::isConnected() const { return this->socket.isValid(); } void IpcClient::waitForConnected() { this->socket.waitForConnected(); } -void IpcClient::waitForDisconnected() { this->socket.waitForDisconnected(); } -void IpcClient::kill() { this->sendMessage(IpcCommand(IpcKillCommand())); } +void IpcClient::waitForDisconnected() { + this->waitingForDisconnect = true; + this->socket.waitForDisconnected(); +} -void IpcClient::onError(QLocalSocket::LocalSocketError error) { +void IpcClient::kill() { + this->sendMessage(IpcCommand(IpcKillCommand())); + this->waitForDisconnected(); +} + +void IpcClient::onError(QLocalSocket::LocalSocketError error) const { + if (this->waitingForDisconnect && error == QLocalSocket::PeerClosedError) return; qCCritical(logIpc) << "Socket Error" << error; } diff --git a/src/ipc/ipc.hpp b/src/ipc/ipc.hpp index 4db1aa6..ad46afb 100644 --- a/src/ipc/ipc.hpp +++ b/src/ipc/ipc.hpp @@ -216,7 +216,10 @@ signals: void disconnected(); private slots: - static void onError(QLocalSocket::LocalSocketError error); + void onError(QLocalSocket::LocalSocketError error) const; + +private: + bool waitingForDisconnect = false; }; } // namespace qs::ipc