Implement ProcessLauncher::processId()

Implement the reply confirmation for the started signal.
After qtcreator_processlauncher starts a new process
we connect to its started() signal and post a reply through
the socket to the LauncherInterface with the information about
the new PID. ProcessLauncherImpl now emits the started signal
with a delay, just after the confirmation has been received.

Change-Id: I2689e8e97b17466bd1f6b32c01909c12d80fcdef
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2021-07-12 15:49:20 +02:00
parent f8e0f6eb91
commit d8286adc7c
6 changed files with 61 additions and 5 deletions

View File

@@ -315,7 +315,7 @@ public:
QString program() const override { return m_command; }
QProcess::ProcessError error() const override { return m_error; }
QProcess::ProcessState state() const override { return m_state; }
qint64 processId() const override { QTC_CHECK(false); return 0; }
qint64 processId() const override { return m_processId; }
QProcess::ExitStatus exitStatus() const override { QTC_CHECK(false); return QProcess::NormalExit; }
QString errorString() const override { return m_errorString; }
void setErrorString(const QString &str) override { m_errorString = str; }
@@ -352,6 +352,7 @@ private:
void handlePacket(Internal::LauncherPacketType type, quintptr token,
const QByteArray &payload);
void handleErrorPacket(const QByteArray &packetData);
void handleStartedPacket(const QByteArray &packetData);
void handleFinishedPacket(const QByteArray &packetData);
void handleSocketReady();
@@ -367,6 +368,7 @@ private:
QProcess::ProcessError m_error = QProcess::UnknownError;
QProcess::ProcessState m_state = QProcess::NotRunning;
QProcess::ProcessChannelMode m_channelMode = QProcess::SeparateChannels;
int m_processId = 0;
int m_exitCode = 0;
bool m_canceled = false;
bool m_socketError = false;
@@ -389,8 +391,6 @@ void ProcessLauncherImpl::start(const QString &program, const QStringList &argum
void ProcessLauncherImpl::doStart()
{
emit started(); // Should be queued in order to behave the same as QProcess?
m_state = QProcess::Running;
StartProcessPacket p(token());
p.command = m_command;
p.arguments = m_arguments;
@@ -412,7 +412,10 @@ void ProcessLauncherImpl::cancel()
"Process canceled before it was started.");
m_error = QProcess::FailedToStart;
m_state = QProcess::NotRunning;
emit errorOccurred(m_error);
if (LauncherInterface::socket()->isReady())
sendPacket(StopProcessPacket(token()));
else
emit errorOccurred(m_error);
break;
case QProcess::Running:
sendPacket(StopProcessPacket(token()));
@@ -430,6 +433,9 @@ void ProcessLauncherImpl::handlePacket(LauncherPacketType type, quintptr token,
case LauncherPacketType::ProcessError:
handleErrorPacket(payload);
break;
case LauncherPacketType::ProcessStarted:
handleStartedPacket(payload);
break;
case LauncherPacketType::ProcessFinished:
handleFinishedPacket(payload);
break;
@@ -467,6 +473,17 @@ void ProcessLauncherImpl::handleErrorPacket(const QByteArray &packetData)
emit errorOccurred(m_error);
}
void ProcessLauncherImpl::handleStartedPacket(const QByteArray &packetData)
{
if (m_canceled)
return;
QTC_ASSERT(m_state == QProcess::Starting, return);
m_state = QProcess::Running;
const auto packet = LauncherPacket::extractPacket<ProcessStartedPacket>(token(), packetData);
m_processId = packet.processId;
emit started();
}
void ProcessLauncherImpl::handleFinishedPacket(const QByteArray &packetData)
{
if (m_canceled)