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 <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2021-07-09 12:39:19 +02:00
parent 3402411751
commit f341107c9f

View File

@@ -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<ProcessFinishedPacket>(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();