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:
Jarek Kobus
2022-04-11 16:37:59 +02:00
parent 75a265d67b
commit 267aa92a8a
8 changed files with 30 additions and 43 deletions

View File

@@ -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.

View File

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

View File

@@ -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;

View File

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

View File

@@ -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

View File

@@ -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;

View File

@@ -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).

View File

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