From f341107c9f3cb7e3d2d4d277eaad10a3e4bbde86 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 9 Jul 2021 12:39:19 +0200 Subject: [PATCH] Mark ProcessLauncherImpl canceled when killing it Mark ProcessLauncherImpl canceled when the kill request has been sent to the process launcher. If ProcessLauncherImpl is canceled, ignore the finished reply sent from process launcher. Recheck the state inside stopProcess() method after calling terminate() - in this way in case of ProcessLauncherImpl we avoid calling unimplemented waitForFinished(). Change-Id: Ibad148f6c7e63ef619e53eb41bbeeb7693be3d25 Reviewed-by: hjk --- src/libs/utils/qtcprocess.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index b8ca7e8b952..068b60d289c 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -364,7 +364,7 @@ private: QProcess::ProcessError m_error = QProcess::UnknownError; QProcess::ProcessState m_state = QProcess::NotRunning; int m_exitCode = 0; - int m_connectionAttempts = 0; + bool m_canceled = false; bool m_socketError = false; }; @@ -408,8 +408,10 @@ void ProcessLauncherImpl::cancel() break; case QProcess::Running: sendPacket(StopProcessPacket(token())); + m_state = QProcess::NotRunning; break; } + m_canceled = true; } void ProcessLauncherImpl::handlePacket(LauncherPacketType type, quintptr token, const QByteArray &payload) @@ -459,6 +461,8 @@ void ProcessLauncherImpl::handleErrorPacket(const QByteArray &packetData) void ProcessLauncherImpl::handleFinishedPacket(const QByteArray &packetData) { + if (m_canceled) + return; QTC_ASSERT(m_state == QProcess::Running, return); m_state = QProcess::NotRunning; const auto packet = LauncherPacket::extractPacket(token(), packetData); @@ -818,6 +822,8 @@ bool QtcProcess::stopProcess() if (state() == QProcess::NotRunning) return true; terminate(); + if (state() == QProcess::NotRunning) + return true; if (waitForFinished(300)) return true; kill();