forked from qt-creator/qt-creator
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:
@@ -67,6 +67,22 @@ void StartProcessPacket::doDeserialize(QDataStream &stream)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ProcessStartedPacket::ProcessStartedPacket(quintptr token)
|
||||||
|
: LauncherPacket(LauncherPacketType::ProcessStarted, token)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessStartedPacket::doSerialize(QDataStream &stream) const
|
||||||
|
{
|
||||||
|
stream << processId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessStartedPacket::doDeserialize(QDataStream &stream)
|
||||||
|
{
|
||||||
|
stream >> processId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
StopProcessPacket::StopProcessPacket(quintptr token)
|
StopProcessPacket::StopProcessPacket(quintptr token)
|
||||||
: LauncherPacket(LauncherPacketType::StopProcess, token)
|
: LauncherPacket(LauncherPacketType::StopProcess, token)
|
||||||
{
|
{
|
||||||
|
@@ -37,7 +37,7 @@ namespace Utils {
|
|||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
enum class LauncherPacketType {
|
enum class LauncherPacketType {
|
||||||
Shutdown, StartProcess, StopProcess, ProcessError, ProcessFinished
|
Shutdown, StartProcess, ProcessStarted, StopProcess, ProcessError, ProcessFinished
|
||||||
};
|
};
|
||||||
|
|
||||||
class PacketParser
|
class PacketParser
|
||||||
@@ -106,6 +106,18 @@ private:
|
|||||||
void doDeserialize(QDataStream &stream) override;
|
void doDeserialize(QDataStream &stream) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ProcessStartedPacket : public LauncherPacket
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ProcessStartedPacket(quintptr token);
|
||||||
|
|
||||||
|
int processId;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void doSerialize(QDataStream &stream) const override;
|
||||||
|
void doDeserialize(QDataStream &stream) override;
|
||||||
|
};
|
||||||
|
|
||||||
class StopProcessPacket : public LauncherPacket
|
class StopProcessPacket : public LauncherPacket
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@@ -100,6 +100,7 @@ void LauncherSocket::handleSocketDataAvailable()
|
|||||||
}
|
}
|
||||||
switch (m_packetParser.type()) {
|
switch (m_packetParser.type()) {
|
||||||
case LauncherPacketType::ProcessError:
|
case LauncherPacketType::ProcessError:
|
||||||
|
case LauncherPacketType::ProcessStarted:
|
||||||
case LauncherPacketType::ProcessFinished:
|
case LauncherPacketType::ProcessFinished:
|
||||||
emit packetArrived(m_packetParser.type(), m_packetParser.token(),
|
emit packetArrived(m_packetParser.type(), m_packetParser.token(),
|
||||||
m_packetParser.packetData());
|
m_packetParser.packetData());
|
||||||
|
@@ -315,7 +315,7 @@ public:
|
|||||||
QString program() const override { return m_command; }
|
QString program() const override { return m_command; }
|
||||||
QProcess::ProcessError error() const override { return m_error; }
|
QProcess::ProcessError error() const override { return m_error; }
|
||||||
QProcess::ProcessState state() const override { return m_state; }
|
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; }
|
QProcess::ExitStatus exitStatus() const override { QTC_CHECK(false); return QProcess::NormalExit; }
|
||||||
QString errorString() const override { return m_errorString; }
|
QString errorString() const override { return m_errorString; }
|
||||||
void setErrorString(const QString &str) override { m_errorString = str; }
|
void setErrorString(const QString &str) override { m_errorString = str; }
|
||||||
@@ -352,6 +352,7 @@ private:
|
|||||||
void handlePacket(Internal::LauncherPacketType type, quintptr token,
|
void handlePacket(Internal::LauncherPacketType type, quintptr token,
|
||||||
const QByteArray &payload);
|
const QByteArray &payload);
|
||||||
void handleErrorPacket(const QByteArray &packetData);
|
void handleErrorPacket(const QByteArray &packetData);
|
||||||
|
void handleStartedPacket(const QByteArray &packetData);
|
||||||
void handleFinishedPacket(const QByteArray &packetData);
|
void handleFinishedPacket(const QByteArray &packetData);
|
||||||
void handleSocketReady();
|
void handleSocketReady();
|
||||||
|
|
||||||
@@ -367,6 +368,7 @@ private:
|
|||||||
QProcess::ProcessError m_error = QProcess::UnknownError;
|
QProcess::ProcessError m_error = QProcess::UnknownError;
|
||||||
QProcess::ProcessState m_state = QProcess::NotRunning;
|
QProcess::ProcessState m_state = QProcess::NotRunning;
|
||||||
QProcess::ProcessChannelMode m_channelMode = QProcess::SeparateChannels;
|
QProcess::ProcessChannelMode m_channelMode = QProcess::SeparateChannels;
|
||||||
|
int m_processId = 0;
|
||||||
int m_exitCode = 0;
|
int m_exitCode = 0;
|
||||||
bool m_canceled = false;
|
bool m_canceled = false;
|
||||||
bool m_socketError = false;
|
bool m_socketError = false;
|
||||||
@@ -389,8 +391,6 @@ void ProcessLauncherImpl::start(const QString &program, const QStringList &argum
|
|||||||
|
|
||||||
void ProcessLauncherImpl::doStart()
|
void ProcessLauncherImpl::doStart()
|
||||||
{
|
{
|
||||||
emit started(); // Should be queued in order to behave the same as QProcess?
|
|
||||||
m_state = QProcess::Running;
|
|
||||||
StartProcessPacket p(token());
|
StartProcessPacket p(token());
|
||||||
p.command = m_command;
|
p.command = m_command;
|
||||||
p.arguments = m_arguments;
|
p.arguments = m_arguments;
|
||||||
@@ -412,7 +412,10 @@ void ProcessLauncherImpl::cancel()
|
|||||||
"Process canceled before it was started.");
|
"Process canceled before it was started.");
|
||||||
m_error = QProcess::FailedToStart;
|
m_error = QProcess::FailedToStart;
|
||||||
m_state = QProcess::NotRunning;
|
m_state = QProcess::NotRunning;
|
||||||
emit errorOccurred(m_error);
|
if (LauncherInterface::socket()->isReady())
|
||||||
|
sendPacket(StopProcessPacket(token()));
|
||||||
|
else
|
||||||
|
emit errorOccurred(m_error);
|
||||||
break;
|
break;
|
||||||
case QProcess::Running:
|
case QProcess::Running:
|
||||||
sendPacket(StopProcessPacket(token()));
|
sendPacket(StopProcessPacket(token()));
|
||||||
@@ -430,6 +433,9 @@ void ProcessLauncherImpl::handlePacket(LauncherPacketType type, quintptr token,
|
|||||||
case LauncherPacketType::ProcessError:
|
case LauncherPacketType::ProcessError:
|
||||||
handleErrorPacket(payload);
|
handleErrorPacket(payload);
|
||||||
break;
|
break;
|
||||||
|
case LauncherPacketType::ProcessStarted:
|
||||||
|
handleStartedPacket(payload);
|
||||||
|
break;
|
||||||
case LauncherPacketType::ProcessFinished:
|
case LauncherPacketType::ProcessFinished:
|
||||||
handleFinishedPacket(payload);
|
handleFinishedPacket(payload);
|
||||||
break;
|
break;
|
||||||
@@ -467,6 +473,17 @@ void ProcessLauncherImpl::handleErrorPacket(const QByteArray &packetData)
|
|||||||
emit errorOccurred(m_error);
|
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)
|
void ProcessLauncherImpl::handleFinishedPacket(const QByteArray &packetData)
|
||||||
{
|
{
|
||||||
if (m_canceled)
|
if (m_canceled)
|
||||||
|
@@ -178,6 +178,14 @@ void LauncherSocketHandler::handleProcessError()
|
|||||||
sendPacket(packet);
|
sendPacket(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LauncherSocketHandler::handleProcessStarted()
|
||||||
|
{
|
||||||
|
Process *proc = senderProcess();
|
||||||
|
ProcessStartedPacket packet(proc->token());
|
||||||
|
packet.processId = proc->processId();
|
||||||
|
sendPacket(packet);
|
||||||
|
}
|
||||||
|
|
||||||
void LauncherSocketHandler::handleProcessFinished()
|
void LauncherSocketHandler::handleProcessFinished()
|
||||||
{
|
{
|
||||||
Process * proc = senderProcess();
|
Process * proc = senderProcess();
|
||||||
@@ -265,6 +273,7 @@ Process *LauncherSocketHandler::setupProcess(quintptr token)
|
|||||||
{
|
{
|
||||||
const auto p = new Process(token, this);
|
const auto p = new Process(token, this);
|
||||||
connect(p, &QProcess::errorOccurred, this, &LauncherSocketHandler::handleProcessError);
|
connect(p, &QProcess::errorOccurred, this, &LauncherSocketHandler::handleProcessError);
|
||||||
|
connect(p, &QProcess::started, this, &LauncherSocketHandler::handleProcessStarted);
|
||||||
connect(p, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
|
connect(p, static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
|
||||||
this, &LauncherSocketHandler::handleProcessFinished);
|
this, &LauncherSocketHandler::handleProcessFinished);
|
||||||
connect(p, &Process::failedToStop, this, &LauncherSocketHandler::handleStopFailure);
|
connect(p, &Process::failedToStop, this, &LauncherSocketHandler::handleStopFailure);
|
||||||
|
@@ -53,6 +53,7 @@ private:
|
|||||||
void handleSocketError();
|
void handleSocketError();
|
||||||
void handleSocketClosed();
|
void handleSocketClosed();
|
||||||
void handleProcessError();
|
void handleProcessError();
|
||||||
|
void handleProcessStarted();
|
||||||
void handleProcessFinished();
|
void handleProcessFinished();
|
||||||
void handleStopFailure();
|
void handleStopFailure();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user