From f301bb3f973edd9aa500ced20f57acfac5a92933 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 16 May 2022 11:05:17 +0200 Subject: [PATCH] QtcProcess: Fix behavior of kill() Make it behave more like QProcess::kill(). Before, when QtcProcess::kill() has been called, the process launcher was putting the process into the reaper and notified the QtcProcess that it was already killed, while in fact it could still be alive for a while since it was in reaper's hands. The current fix makes the behavior similar to what QProcess does when calling kill(). So now, in case of a call to kill() the process isn't put into the reaper yet, so it has a chance to report back the finished signal when the process was really stopped. We still use the old behavior of putting the running process into the reaper in case of a call to QtcProcess::close() and when d'tor of QtcProcess was called. We don't report back the confirmation about putting the process into the reaper, since close() is always called from ProcessLauncherImpl d'tor, so there is no one to receive this confirmation anyway. Change-Id: I665e7c8fb1a391dda30c86389259961e715926d6 Reviewed-by: hjk --- src/libs/utils/launcherpackets.h | 5 ++-- src/libs/utils/launchersocket.cpp | 6 ++++ src/libs/utils/launchersocket.h | 1 + src/libs/utils/qtcprocess.cpp | 2 +- .../processlauncher/launchersockethandler.cpp | 29 ++++++------------- 5 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/libs/utils/launcherpackets.h b/src/libs/utils/launcherpackets.h index 896b5a35c5a..2c4dad8d08b 100644 --- a/src/libs/utils/launcherpackets.h +++ b/src/libs/utils/launcherpackets.h @@ -143,8 +143,9 @@ public: StopProcessPacket(quintptr token); enum class SignalType { - Kill, - Terminate + Kill, // Calls QProcess::kill + Terminate, // Calls QProcess::terminate + Close // Puts the process into the reaper, no confirmation signal is being sent. }; SignalType signalType = SignalType::Kill; diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 048d118e935..4de1a778d83 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -262,6 +262,12 @@ void CallerHandle::kill() sendStopPacket(StopProcessPacket::SignalType::Kill); } +void CallerHandle::close() +{ + QTC_ASSERT(isCalledFromCallersThread(), return); + sendStopPacket(StopProcessPacket::SignalType::Close); +} + qint64 CallerHandle::processId() const { QTC_ASSERT(isCalledFromCallersThread(), return 0); diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index 1de0585d49a..081cd314659 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -89,6 +89,7 @@ public: void sendStopPacket(StopProcessPacket::SignalType signalType); void terminate(); void kill(); + void close(); qint64 processId() const; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index c8a5f59259f..40ba6a6afbd 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -437,7 +437,7 @@ public: } ~ProcessLauncherImpl() final { - m_handle->kill(); + m_handle->close(); LauncherInterface::unregisterHandle(token()); m_handle = nullptr; } diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index af9e94d3bf3..321f4688195 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -242,28 +242,17 @@ void LauncherSocketHandler::handleStopPacket() m_packetParser.token(), m_packetParser.packetData()); - if (packet.signalType == StopProcessPacket::SignalType::Terminate) { + switch (packet.signalType) { + case StopProcessPacket::SignalType::Terminate: process->terminate(); - return; + break; + case StopProcessPacket::SignalType::Kill: + process->kill(); + break; + case StopProcessPacket::SignalType::Close: + removeProcess(process->token()); + break; } - - if (process->state() == QProcess::NotRunning) { - // This shouldn't happen, since as soon as process finishes or error occurrs - // the process is being removed. - logWarn("Got stop request when process was not running"); - } else { - // We got the client request to stop the starting / running process. - // We report process exit to the client. - ProcessDonePacket packet(process->token()); - packet.error = QProcess::Crashed; - packet.exitCode = -1; - packet.exitStatus = QProcess::CrashExit; - if (process->processChannelMode() != QProcess::MergedChannels) - packet.stdErr = process->readAllStandardError(); - packet.stdOut = process->readAllStandardOutput(); - sendPacket(packet); - } - removeProcess(process->token()); } void LauncherSocketHandler::handleShutdownPacket()