forked from qt-creator/qt-creator
ProcessInterface: Pass processId with started() signal
Pass also applicationMainThreadId optionally (Windows only). Remove two virtual accessors. Task-number: QTCREATORBUG-27358 Change-Id: I3b12b642cc3c109653276c0fbf65e7f614ce6b56 Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: hjk <hjk@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -176,7 +176,7 @@ void CallerHandle::handleStarted(const StartedSignal *launcherSignal)
|
|||||||
QTC_ASSERT(isCalledFromCallersThread(), return);
|
QTC_ASSERT(isCalledFromCallersThread(), return);
|
||||||
m_processState = QProcess::Running;
|
m_processState = QProcess::Running;
|
||||||
m_processId = launcherSignal->processId();
|
m_processId = launcherSignal->processId();
|
||||||
emit started();
|
emit started(m_processId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallerHandle::handleReadyRead(const ReadyReadSignal *launcherSignal)
|
void CallerHandle::handleReadyRead(const ReadyReadSignal *launcherSignal)
|
||||||
@@ -190,6 +190,7 @@ void CallerHandle::handleDone(const DoneSignal *launcherSignal)
|
|||||||
QTC_ASSERT(isCalledFromCallersThread(), return);
|
QTC_ASSERT(isCalledFromCallersThread(), return);
|
||||||
m_processState = QProcess::NotRunning;
|
m_processState = QProcess::NotRunning;
|
||||||
emit done(launcherSignal->resultData());
|
emit done(launcherSignal->resultData());
|
||||||
|
m_processId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called from launcher's thread exclusively.
|
// Called from launcher's thread exclusively.
|
||||||
|
|||||||
@@ -108,9 +108,9 @@ public:
|
|||||||
void setProcessSetupData(const ProcessSetupData::Ptr &setup);
|
void setProcessSetupData(const ProcessSetupData::Ptr &setup);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void started();
|
void started(qint64 processId, qint64 applicationMainThreadId = 0);
|
||||||
void done(const Utils::ProcessResultData &resultData);
|
|
||||||
void readyRead(const QByteArray &outputData, const QByteArray &errorData);
|
void readyRead(const QByteArray &outputData, const QByteArray &errorData);
|
||||||
|
void done(const Utils::ProcessResultData &resultData);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool waitForSignal(int msecs, SignalType newSignal);
|
bool waitForSignal(int msecs, SignalType newSignal);
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ public:
|
|||||||
|
|
||||||
virtual qint64 write(const QByteArray &data) = 0;
|
virtual qint64 write(const QByteArray &data) = 0;
|
||||||
|
|
||||||
virtual qint64 processId() const = 0;
|
|
||||||
virtual QProcess::ProcessState state() const = 0;
|
virtual QProcess::ProcessState state() const = 0;
|
||||||
|
|
||||||
virtual bool waitForStarted(int msecs) = 0;
|
virtual bool waitForStarted(int msecs) = 0;
|
||||||
@@ -95,10 +94,9 @@ public:
|
|||||||
virtual bool waitForFinished(int msecs) = 0;
|
virtual bool waitForFinished(int msecs) = 0;
|
||||||
|
|
||||||
virtual void kickoffProcess();
|
virtual void kickoffProcess();
|
||||||
virtual qint64 applicationMainThreadID() const;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void started();
|
void started(qint64 processId, qint64 applicationMainThreadId = 0);
|
||||||
void readyRead(const QByteArray &outputData, const QByteArray &errorData);
|
void readyRead(const QByteArray &outputData, const QByteArray &errorData);
|
||||||
void done(const Utils::ProcessResultData &resultData);
|
void done(const Utils::ProcessResultData &resultData);
|
||||||
|
|
||||||
@@ -131,7 +129,6 @@ public:
|
|||||||
|
|
||||||
qint64 write(const QByteArray &data) override { return m_target->write(data); }
|
qint64 write(const QByteArray &data) override { return m_target->write(data); }
|
||||||
|
|
||||||
qint64 processId() const override { return m_target->processId(); }
|
|
||||||
QProcess::ProcessState state() const override { return m_target->state(); }
|
QProcess::ProcessState state() const override { return m_target->state(); }
|
||||||
|
|
||||||
bool waitForStarted(int msecs) override { return m_target->waitForStarted(msecs); }
|
bool waitForStarted(int msecs) override { return m_target->waitForStarted(msecs); }
|
||||||
@@ -139,7 +136,6 @@ public:
|
|||||||
bool waitForFinished(int msecs) override { return m_target->waitForFinished(msecs); }
|
bool waitForFinished(int msecs) override { return m_target->waitForFinished(msecs); }
|
||||||
|
|
||||||
void kickoffProcess() override { m_target->kickoffProcess(); }
|
void kickoffProcess() override { m_target->kickoffProcess(); }
|
||||||
qint64 applicationMainThreadID() const override { return m_target->applicationMainThreadID(); }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ProcessInterface *m_target;
|
ProcessInterface *m_target;
|
||||||
|
|||||||
@@ -354,7 +354,6 @@ public:
|
|||||||
qint64 write(const QByteArray &data) final { return m_process->write(data); }
|
qint64 write(const QByteArray &data) final { return m_process->write(data); }
|
||||||
|
|
||||||
QProcess::ProcessState state() const final { return m_process->state(); }
|
QProcess::ProcessState state() const final { return m_process->state(); }
|
||||||
qint64 processId() const final { return m_process->processId(); }
|
|
||||||
|
|
||||||
bool waitForStarted(int msecs) final { return m_process->waitForStarted(msecs); }
|
bool waitForStarted(int msecs) final { return m_process->waitForStarted(msecs); }
|
||||||
bool waitForReadyRead(int msecs) final { return m_process->waitForReadyRead(msecs); }
|
bool waitForReadyRead(int msecs) final { return m_process->waitForReadyRead(msecs); }
|
||||||
@@ -384,7 +383,7 @@ private:
|
|||||||
void handleStarted()
|
void handleStarted()
|
||||||
{
|
{
|
||||||
m_process->processStartHandler()->handleProcessStarted();
|
m_process->processStartHandler()->handleProcessStarted();
|
||||||
emit started();
|
emit started(m_process->processId());
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleError(QProcess::ProcessError error)
|
void handleError(QProcess::ProcessError error)
|
||||||
@@ -437,7 +436,7 @@ public:
|
|||||||
void interrupt() final
|
void interrupt() final
|
||||||
{
|
{
|
||||||
if (m_setup->m_useCtrlCStub) // bypass launcher and interrupt directly
|
if (m_setup->m_useCtrlCStub) // bypass launcher and interrupt directly
|
||||||
ProcessHelper::interruptPid(processId());
|
ProcessHelper::interruptPid(m_handle->processId());
|
||||||
}
|
}
|
||||||
void terminate() final { m_handle->terminate(); }
|
void terminate() final { m_handle->terminate(); }
|
||||||
void kill() final { m_handle->kill(); }
|
void kill() final { m_handle->kill(); }
|
||||||
@@ -445,7 +444,6 @@ public:
|
|||||||
qint64 write(const QByteArray &data) final { return m_handle->write(data); }
|
qint64 write(const QByteArray &data) final { return m_handle->write(data); }
|
||||||
|
|
||||||
QProcess::ProcessState state() const final { return m_handle->state(); }
|
QProcess::ProcessState state() const final { return m_handle->state(); }
|
||||||
qint64 processId() const final { return m_handle->processId(); }
|
|
||||||
|
|
||||||
bool waitForStarted(int msecs) final { return m_handle->waitForStarted(msecs); }
|
bool waitForStarted(int msecs) final { return m_handle->waitForStarted(msecs); }
|
||||||
bool waitForReadyRead(int msecs) final { return m_handle->waitForReadyRead(msecs); }
|
bool waitForReadyRead(int msecs) final { return m_handle->waitForReadyRead(msecs); }
|
||||||
@@ -497,7 +495,7 @@ public:
|
|||||||
m_process->setParent(this);
|
m_process->setParent(this);
|
||||||
|
|
||||||
connect(m_process.get(), &ProcessInterface::started,
|
connect(m_process.get(), &ProcessInterface::started,
|
||||||
this, &QtcProcessPrivate::emitStarted);
|
this, &QtcProcessPrivate::handleStarted);
|
||||||
connect(m_process.get(), &ProcessInterface::readyRead,
|
connect(m_process.get(), &ProcessInterface::readyRead,
|
||||||
this, &QtcProcessPrivate::handleReadyRead);
|
this, &QtcProcessPrivate::handleReadyRead);
|
||||||
connect(m_process.get(), &ProcessInterface::done,
|
connect(m_process.get(), &ProcessInterface::done,
|
||||||
@@ -536,6 +534,7 @@ public:
|
|||||||
ProcessSetupData m_setup;
|
ProcessSetupData m_setup;
|
||||||
|
|
||||||
void slotTimeout();
|
void slotTimeout();
|
||||||
|
void handleStarted(qint64 processId, qint64 applicationMainThreadId);
|
||||||
void handleReadyRead(const QByteArray &outputData, const QByteArray &errorData);
|
void handleReadyRead(const QByteArray &outputData, const QByteArray &errorData);
|
||||||
void handleDone(const ProcessResultData &data);
|
void handleDone(const ProcessResultData &data);
|
||||||
void handleError();
|
void handleError();
|
||||||
@@ -550,6 +549,8 @@ public:
|
|||||||
ProcessResult interpretExitCode(int exitCode);
|
ProcessResult interpretExitCode(int exitCode);
|
||||||
|
|
||||||
QProcess::ProcessChannelMode m_processChannelMode = QProcess::SeparateChannels;
|
QProcess::ProcessChannelMode m_processChannelMode = QProcess::SeparateChannels;
|
||||||
|
qint64 m_processId = 0;
|
||||||
|
qint64 m_applicationMainThreadId = 0;
|
||||||
ProcessResultData m_resultData;
|
ProcessResultData m_resultData;
|
||||||
|
|
||||||
QTextCodec *m_codec = QTextCodec::codecForLocale();
|
QTextCodec *m_codec = QTextCodec::codecForLocale();
|
||||||
@@ -584,6 +585,8 @@ void QtcProcessPrivate::clearForRun()
|
|||||||
m_stdErr.clearForRun();
|
m_stdErr.clearForRun();
|
||||||
m_stdErr.codec = m_codec;
|
m_stdErr.codec = m_codec;
|
||||||
m_result = ProcessResult::StartFailed;
|
m_result = ProcessResult::StartFailed;
|
||||||
|
m_processId = 0;
|
||||||
|
m_applicationMainThreadId = 0;
|
||||||
m_resultData = {};
|
m_resultData = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,11 +606,6 @@ void ProcessInterface::kickoffProcess()
|
|||||||
QTC_CHECK(false);
|
QTC_CHECK(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 ProcessInterface::applicationMainThreadID() const
|
|
||||||
{
|
|
||||||
QTC_CHECK(false); return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class Utils::QtcProcess
|
\class Utils::QtcProcess
|
||||||
|
|
||||||
@@ -1125,11 +1123,9 @@ void QtcProcess::kickoffProcess()
|
|||||||
d->m_process->kickoffProcess();
|
d->m_process->kickoffProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 QtcProcess::applicationMainThreadID() const
|
qint64 QtcProcess::applicationMainThreadId() const
|
||||||
{
|
{
|
||||||
if (d->m_process)
|
return d->m_applicationMainThreadId;
|
||||||
return d->m_process->applicationMainThreadID();
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
|
void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
|
||||||
@@ -1152,9 +1148,7 @@ bool QtcProcess::isRunning() const
|
|||||||
|
|
||||||
qint64 QtcProcess::processId() const
|
qint64 QtcProcess::processId() const
|
||||||
{
|
{
|
||||||
if (d->m_process)
|
return d->m_processId;
|
||||||
return d->m_process->processId();
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtcProcess::waitForStarted(int msecs)
|
bool QtcProcess::waitForStarted(int msecs)
|
||||||
@@ -1539,6 +1533,13 @@ void QtcProcessPrivate::slotTimeout()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QtcProcessPrivate::handleStarted(qint64 processId, qint64 applicationMainThreadId)
|
||||||
|
{
|
||||||
|
m_processId = processId;
|
||||||
|
m_applicationMainThreadId = applicationMainThreadId;
|
||||||
|
emitStarted();
|
||||||
|
}
|
||||||
|
|
||||||
void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByteArray &errorData)
|
void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByteArray &errorData)
|
||||||
{
|
{
|
||||||
// TODO: check why we need this timer?
|
// TODO: check why we need this timer?
|
||||||
@@ -1609,6 +1610,8 @@ void QtcProcessPrivate::handleDone(const ProcessResultData &data)
|
|||||||
emitFinished();
|
emitFinished();
|
||||||
|
|
||||||
emit q->done();
|
emit q->done();
|
||||||
|
m_processId = 0;
|
||||||
|
m_applicationMainThreadId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtcProcessPrivate::handleError()
|
void QtcProcessPrivate::handleError()
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
bool waitForFinished(int msecs = 30000);
|
bool waitForFinished(int msecs = 30000);
|
||||||
|
|
||||||
void kickoffProcess();
|
void kickoffProcess();
|
||||||
qint64 applicationMainThreadID() const;
|
qint64 applicationMainThreadId() const;
|
||||||
|
|
||||||
// ProcessSetupData related
|
// ProcessSetupData related
|
||||||
|
|
||||||
|
|||||||
@@ -163,13 +163,6 @@ TerminalImpl::~TerminalImpl()
|
|||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 TerminalImpl::applicationMainThreadID() const
|
|
||||||
{
|
|
||||||
if (HostOsInfo::isWindowsHost())
|
|
||||||
return d->m_appMainThreadId;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TerminalImpl::start()
|
void TerminalImpl::start()
|
||||||
{
|
{
|
||||||
if (isRunning())
|
if (isRunning())
|
||||||
@@ -620,6 +613,7 @@ void TerminalImpl::readStubOutput()
|
|||||||
emitError(QProcess::FailedToStart,
|
emitError(QProcess::FailedToStart,
|
||||||
msgCannotExecute(m_setup->m_commandLine.executable().toUserOutput(), winErrorMessage(out.mid(9).toInt())));
|
msgCannotExecute(m_setup->m_commandLine.executable().toUserOutput(), winErrorMessage(out.mid(9).toInt())));
|
||||||
} else if (out.startsWith("thread ")) { // Windows only
|
} else if (out.startsWith("thread ")) { // Windows only
|
||||||
|
// TODO: ensure that it comes before "pid " comes
|
||||||
d->m_appMainThreadId = out.mid(7).toLongLong();
|
d->m_appMainThreadId = out.mid(7).toLongLong();
|
||||||
} else if (out.startsWith("pid ")) {
|
} else if (out.startsWith("pid ")) {
|
||||||
// Will not need it any more
|
// Will not need it any more
|
||||||
@@ -647,7 +641,7 @@ void TerminalImpl::readStubOutput()
|
|||||||
emitFinished(chldStatus, QProcess::NormalExit);
|
emitFinished(chldStatus, QProcess::NormalExit);
|
||||||
});
|
});
|
||||||
|
|
||||||
emit started();
|
emit started(d->m_processId, d->m_appMainThreadId);
|
||||||
} else {
|
} else {
|
||||||
emitError(QProcess::UnknownError, msgUnexpectedOutput(out));
|
emitError(QProcess::UnknownError, msgUnexpectedOutput(out));
|
||||||
TerminateProcess(d->m_pid->hProcess, (unsigned)-1);
|
TerminateProcess(d->m_pid->hProcess, (unsigned)-1);
|
||||||
@@ -666,7 +660,7 @@ void TerminalImpl::readStubOutput()
|
|||||||
d->m_tempFile = nullptr;
|
d->m_tempFile = nullptr;
|
||||||
} else if (out.startsWith("pid ")) {
|
} else if (out.startsWith("pid ")) {
|
||||||
d->m_processId = out.mid(4).toInt();
|
d->m_processId = out.mid(4).toInt();
|
||||||
emit started();
|
emit started(d->m_processId);
|
||||||
} else if (out.startsWith("exit ")) {
|
} else if (out.startsWith("exit ")) {
|
||||||
emitFinished(out.mid(5).toInt(), QProcess::NormalExit);
|
emitFinished(out.mid(5).toInt(), QProcess::NormalExit);
|
||||||
} else if (out.startsWith("crash ")) {
|
} else if (out.startsWith("crash ")) {
|
||||||
@@ -728,11 +722,6 @@ void TerminalImpl::cleanupStub()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 TerminalImpl::processId() const
|
|
||||||
{
|
|
||||||
return d->m_processId;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TerminalImpl::emitError(QProcess::ProcessError error, const QString &errorString)
|
void TerminalImpl::emitError(QProcess::ProcessError error, const QString &errorString)
|
||||||
{
|
{
|
||||||
d->m_result.m_error = error;
|
d->m_result.m_error = error;
|
||||||
|
|||||||
@@ -60,11 +60,9 @@ public:
|
|||||||
void start() final;
|
void start() final;
|
||||||
|
|
||||||
QProcess::ProcessState state() const final;
|
QProcess::ProcessState state() const final;
|
||||||
qint64 processId() const final;
|
|
||||||
|
|
||||||
void kickoffProcess() final; // only debugger terminal, only non-windows
|
void kickoffProcess() final; // only debugger terminal, only non-windows
|
||||||
void interrupt() final; // only debugger terminal, only non-windows
|
void interrupt() final; // only debugger terminal, only non-windows
|
||||||
qint64 applicationMainThreadID() const final; // only debugger terminal, only windows (-1 otherwise)
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// OK, however, impl looks a bit different (!= NotRunning vs == Running).
|
// OK, however, impl looks a bit different (!= NotRunning vs == Running).
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ void TerminalRunner::stop()
|
|||||||
void TerminalRunner::stubStarted()
|
void TerminalRunner::stubStarted()
|
||||||
{
|
{
|
||||||
m_applicationPid = m_stubProc->processId();
|
m_applicationPid = m_stubProc->processId();
|
||||||
m_applicationMainThreadId = m_stubProc->applicationMainThreadID();
|
m_applicationMainThreadId = m_stubProc->applicationMainThreadId();
|
||||||
reportStarted();
|
reportStarted();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user