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()