forked from qt-creator/qt-creator
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:
@@ -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();
|
||||
|
Reference in New Issue
Block a user