aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2022-04-12 11:18:09 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2022-04-14 13:49:25 +0000
commit44c7020651d96f1f6985b40767b056e19cb4cfee (patch)
treebade6afd20bb325939e6d4a23d7919d88e6b74ba
parent160dc1692179bc1b03ed4e1cebc532fa89675d65 (diff)
ProcessInterface: Get rid of state() method
This is fully controlled by QtcProcess itself, so provide general implementation of state() inside QtcProcess. Task-number: QTCREATORBUG-27358 Change-Id: Id6f0b771ed933f870b80d6856c6d94896f946516 Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/libs/ssh/sshremoteprocess.cpp4
-rw-r--r--src/libs/ssh/sshremoteprocess.h2
-rw-r--r--src/libs/utils/processinterface.h2
-rw-r--r--src/libs/utils/qtcprocess.cpp54
-rw-r--r--src/libs/utils/qtcprocess.h5
-rw-r--r--src/libs/utils/terminalprocess.cpp10
-rw-r--r--src/libs/utils/terminalprocess_p.h2
-rw-r--r--src/plugins/docker/dockerdevice.cpp6
-rw-r--r--src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp20
-rw-r--r--src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h3
10 files changed, 52 insertions, 56 deletions
diff --git a/src/libs/ssh/sshremoteprocess.cpp b/src/libs/ssh/sshremoteprocess.cpp
index 3c98482bbc5..7c4b089fd82 100644
--- a/src/libs/ssh/sshremoteprocess.cpp
+++ b/src/libs/ssh/sshremoteprocess.cpp
@@ -66,7 +66,7 @@ void SshRemoteProcess::emitFinished()
QtcProcess::emitFinished();
}
-void SshRemoteProcess::start()
+void SshRemoteProcess::startImpl()
{
QTC_ASSERT(!isRunning(), return);
m_errorString.clear();
@@ -78,7 +78,7 @@ void SshRemoteProcess::start()
}
qCDebug(sshLog) << "starting remote process:" << cmd.toUserOutput();
setCommand(cmd);
- QtcProcess::start();
+ QtcProcess::startImpl();
}
ProcessResultData SshRemoteProcess::resultData() const
diff --git a/src/libs/ssh/sshremoteprocess.h b/src/libs/ssh/sshremoteprocess.h
index 305f4859e72..9c011bfa64e 100644
--- a/src/libs/ssh/sshremoteprocess.h
+++ b/src/libs/ssh/sshremoteprocess.h
@@ -41,7 +41,7 @@ public:
SshRemoteProcess(const QString &command, const QStringList &connectionArgs);
void requestX11Forwarding(const QString &displayName);
- void start() override;
+ void startImpl() override;
Utils::ProcessResultData resultData() const override;
Utils::CommandLine fullLocalCommandLine(bool inTerminal = false) const;
diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h
index 65eab71897a..dda1f6529f5 100644
--- a/src/libs/utils/processinterface.h
+++ b/src/libs/utils/processinterface.h
@@ -110,8 +110,6 @@ private:
// It's being called in Starting or Running state.
virtual void sendControlSignal(ControlSignal controlSignal) = 0;
- virtual QProcess::ProcessState state() const = 0;
-
// It's being called only in Starting state.
virtual bool waitForStarted(int msecs) = 0;
diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp
index 7fe4bd2b898..0249917f153 100644
--- a/src/libs/utils/qtcprocess.cpp
+++ b/src/libs/utils/qtcprocess.cpp
@@ -361,8 +361,6 @@ private:
}
}
- QProcess::ProcessState state() const final { return m_process->state(); }
-
bool waitForStarted(int msecs) final { return m_process->waitForStarted(msecs); }
bool waitForReadyRead(int msecs) final { return m_process->waitForReadyRead(msecs); }
bool waitForFinished(int msecs) final { return m_process->waitForFinished(msecs); }
@@ -460,8 +458,6 @@ private:
}
}
- QProcess::ProcessState state() const final { return m_handle->state(); }
-
bool waitForStarted(int msecs) final { return m_handle->waitForStarted(msecs); }
bool waitForReadyRead(int msecs) final { return m_handle->waitForReadyRead(msecs); }
bool waitForFinished(int msecs) final { return m_handle->waitForFinished(msecs); }
@@ -564,6 +560,7 @@ public:
ProcessResult interpretExitCode(int exitCode);
+ QProcess::ProcessState m_state = QProcess::NotRunning;
QProcess::ProcessChannelMode m_processChannelMode = QProcess::SeparateChannels;
qint64 m_processId = 0;
qint64 m_applicationMainThreadId = 0;
@@ -601,6 +598,8 @@ void QtcProcessPrivate::clearForRun()
m_stdErr.clearForRun();
m_stdErr.codec = m_codec;
m_result = ProcessResult::StartFailed;
+
+ m_state = QProcess::NotRunning;
m_processId = 0;
m_applicationMainThreadId = 0;
m_resultData = {};
@@ -780,9 +779,14 @@ void QtcProcess::setUseCtrlCStub(bool enabled)
void QtcProcess::start()
{
-// TODO: Uncomment when we de-virtualize start()
-// QTC_ASSERT(state() == QProcess::NotRunning, return);
+ QTC_ASSERT(state() == QProcess::NotRunning, return);
+ d->clearForRun();
+ d->m_state = QProcess::Starting;
+ startImpl();
+}
+void QtcProcess::startImpl()
+{
ProcessInterface *processImpl = nullptr;
if (d->m_setup.m_commandLine.executable().needsDevice()) {
if (s_deviceHooks.processImplHook) { // TODO: replace "if" with an assert for the hook
@@ -797,7 +801,6 @@ void QtcProcess::start()
processImpl = d->createProcessInterface();
}
QTC_ASSERT(processImpl, return);
- d->clearForRun();
d->setProcessInterface(processImpl);
d->m_process->m_setup = d->m_setup;
d->m_process->m_setup.m_commandLine = d->fullCommandLine();
@@ -811,25 +814,25 @@ void QtcProcess::start()
void QtcProcess::terminate()
{
- if (d->m_process)
+ if (d->m_process && (d->m_state != QProcess::NotRunning))
d->m_process->sendControlSignal(ControlSignal::Terminate);
}
void QtcProcess::kill()
{
- if (d->m_process)
+ if (d->m_process && (d->m_state != QProcess::NotRunning))
d->m_process->sendControlSignal(ControlSignal::Kill);
}
void QtcProcess::interrupt()
{
- if (d->m_process)
+ if (d->m_process && (d->m_state != QProcess::NotRunning))
d->m_process->sendControlSignal(ControlSignal::Interrupt);
}
void QtcProcess::kickoffProcess()
{
- if (d->m_process)
+ if (d->m_process && (d->m_state != QProcess::NotRunning))
d->m_process->sendControlSignal(ControlSignal::KickOff);
}
@@ -1147,9 +1150,7 @@ void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode)
QProcess::ProcessState QtcProcess::state() const
{
- if (d->m_process)
- return d->m_process->state();
- return QProcess::NotRunning;
+ return d->m_state;
}
bool QtcProcess::isRunning() const
@@ -1165,18 +1166,24 @@ qint64 QtcProcess::processId() const
bool QtcProcess::waitForStarted(int msecs)
{
QTC_ASSERT(d->m_process, return false);
+ if (d->m_state != QProcess::Starting)
+ return false;
return s_waitForStarted.measureAndRun(&ProcessInterface::waitForStarted, d->m_process, msecs);
}
bool QtcProcess::waitForReadyRead(int msecs)
{
QTC_ASSERT(d->m_process, return false);
+ if (d->m_state == QProcess::NotRunning)
+ return false;
return d->m_process->waitForReadyRead(msecs);
}
bool QtcProcess::waitForFinished(int msecs)
{
QTC_ASSERT(d->m_process, return false);
+ if (d->m_state == QProcess::NotRunning)
+ return false;
return d->m_process->waitForFinished(msecs);
}
@@ -1198,6 +1205,7 @@ qint64 QtcProcess::write(const QByteArray &input)
{
QTC_ASSERT(processMode() == ProcessMode::Writer, return -1);
QTC_ASSERT(d->m_process, return -1);
+ QTC_ASSERT(state() == QProcess::Running, return -1);
return d->m_process->write(input);
}
@@ -1543,6 +1551,9 @@ void QtcProcessPrivate::slotTimeout()
void QtcProcessPrivate::handleStarted(qint64 processId, qint64 applicationMainThreadId)
{
+ QTC_CHECK(m_state == QProcess::Starting);
+ m_state = QProcess::Running;
+
m_processId = processId;
m_applicationMainThreadId = applicationMainThreadId;
emitStarted();
@@ -1550,6 +1561,8 @@ void QtcProcessPrivate::handleStarted(qint64 processId, qint64 applicationMainTh
void QtcProcessPrivate::handleReadyRead(const QByteArray &outputData, const QByteArray &errorData)
{
+ QTC_CHECK(m_state == QProcess::Running);
+
// TODO: check why we need this timer?
m_hangTimerCount = 0;
// TODO: store a copy of m_processChannelMode on start()? Currently we assert that state
@@ -1583,6 +1596,19 @@ void QtcProcessPrivate::handleDone(const ProcessResultData &data)
{
m_resultData = data;
+ switch (m_state) {
+ case QProcess::NotRunning:
+ QTC_CHECK(false); // Can't happen
+ break;
+ case QProcess::Starting:
+ QTC_CHECK(m_resultData.m_error == QProcess::FailedToStart);
+ break;
+ case QProcess::Running:
+ QTC_CHECK(m_resultData.m_error != QProcess::FailedToStart);
+ break;
+ }
+ m_state = QProcess::NotRunning;
+
// This code (255) is being returned by QProcess when FailedToStart error occurred
if (m_resultData.m_error == QProcess::FailedToStart)
m_resultData.m_exitCode = 0xFF;
diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h
index 9188d65906b..1852d7c6ce2 100644
--- a/src/libs/utils/qtcprocess.h
+++ b/src/libs/utils/qtcprocess.h
@@ -59,7 +59,7 @@ public:
// ProcessInterface related
- virtual void start();
+ void start();
virtual void terminate();
virtual void kill();
@@ -74,7 +74,7 @@ public:
virtual qint64 processId() const;
qint64 applicationMainThreadId() const;
- virtual QProcess::ProcessState state() const;
+ QProcess::ProcessState state() const;
virtual ProcessResultData resultData() const;
int exitCode() const;
@@ -201,6 +201,7 @@ signals:
protected:
// TODO: remove these methods on QtcProcess de-virtualization
+ virtual void startImpl();
virtual void emitStarted();
virtual void emitFinished();
diff --git a/src/libs/utils/terminalprocess.cpp b/src/libs/utils/terminalprocess.cpp
index 28d7b340b5c..3f60a8fc7ec 100644
--- a/src/libs/utils/terminalprocess.cpp
+++ b/src/libs/utils/terminalprocess.cpp
@@ -513,16 +513,6 @@ bool TerminalImpl::isRunning() const
#endif
}
-QProcess::ProcessState TerminalImpl::state() const
-{
-#ifdef Q_OS_WIN
- return (d->m_pid != nullptr) ? QProcess::Running : QProcess::NotRunning;
-#else
- return (d->m_stubSocket && d->m_stubSocket->isOpen())
- ? QProcess::Running : d->m_process.state();
-#endif
-}
-
QString TerminalImpl::stubServerListen()
{
#ifdef Q_OS_WIN
diff --git a/src/libs/utils/terminalprocess_p.h b/src/libs/utils/terminalprocess_p.h
index fe57aa6655f..f92d00f8448 100644
--- a/src/libs/utils/terminalprocess_p.h
+++ b/src/libs/utils/terminalprocess_p.h
@@ -56,8 +56,6 @@ private:
// intentionally no-op without an assert
bool waitForFinished(int) final { return false; }
- QProcess::ProcessState state() const final;
-
// OK, however, impl looks a bit different (!= NotRunning vs == Running).
// Most probably changing it into (== Running) should be OK.
bool isRunning() const;
diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp
index 39d2ae3a82c..2c7c9c6aa4a 100644
--- a/src/plugins/docker/dockerdevice.cpp
+++ b/src/plugins/docker/dockerdevice.cpp
@@ -107,7 +107,7 @@ public:
DockerDeviceProcess(const QSharedPointer<const IDevice> &device, QObject *parent = nullptr);
~DockerDeviceProcess() {}
- void start() override;
+ void startImpl() override;
void interrupt() override;
const QSharedPointer<const IDevice> m_device;
@@ -120,7 +120,7 @@ DockerDeviceProcess::DockerDeviceProcess(const QSharedPointer<const IDevice> &de
setProcessMode(ProcessMode::Writer);
}
-void DockerDeviceProcess::start()
+void DockerDeviceProcess::startImpl()
{
QTC_ASSERT(state() == QProcess::NotRunning, return);
DockerDevice::ConstPtr dockerDevice = qSharedPointerCast<const DockerDevice>(m_device);
@@ -139,7 +139,7 @@ void DockerDeviceProcess::start()
setCommand(command);
LOG("Running process:" << command.toUserOutput() << "in" << workingDirectory().toUserOutput());
- QtcProcess::start();
+ QtcProcess::startImpl();
}
void DockerDeviceProcess::interrupt()
diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
index 6b7ff6612c3..cf3cfccd7f3 100644
--- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
+++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.cpp
@@ -94,7 +94,7 @@ SshDeviceProcess::~SshDeviceProcess()
d->setState(SshDeviceProcessPrivate::Inactive);
}
-void SshDeviceProcess::start()
+void SshDeviceProcess::startImpl()
{
QTC_ASSERT(d->state == SshDeviceProcessPrivate::Inactive, return);
QTC_ASSERT(usesTerminal() || !commandLine().isEmpty(), return);
@@ -140,22 +140,6 @@ void SshDeviceProcess::kill()
d->doSignal(Signal::Kill);
}
-QProcess::ProcessState SshDeviceProcess::state() const
-{
- switch (d->state) {
- case SshDeviceProcessPrivate::Inactive:
- return QProcess::NotRunning;
- case SshDeviceProcessPrivate::Connecting:
- case SshDeviceProcessPrivate::Connected:
- return QProcess::Starting;
- case SshDeviceProcessPrivate::ProcessRunning:
- return QProcess::Running;
- default:
- QTC_CHECK(false);
- return QProcess::NotRunning;
- }
-}
-
ProcessResultData SshDeviceProcess::resultData() const
{
const ProcessResultData result = QtcProcess::resultData();
@@ -190,7 +174,7 @@ void SshDeviceProcess::handleConnected()
if (usesTerminal()) {
setAbortOnMetaChars(false);
setCommand(d->remoteProcess->fullLocalCommandLine(true));
- QtcProcess::start();
+ QtcProcess::startImpl();
} else {
connect(d->remoteProcess.get(), &QtcProcess::started,
this, &SshDeviceProcess::handleProcessStarted);
diff --git a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
index 9d0db52694c..1d09e253124 100644
--- a/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
+++ b/src/plugins/projectexplorer/devicesupport/sshdeviceprocess.h
@@ -42,12 +42,11 @@ public:
explicit SshDeviceProcess(const QSharedPointer<const IDevice> &device, QObject *parent = nullptr);
~SshDeviceProcess() override;
- void start() override;
+ void startImpl() override;
void interrupt() override;
void terminate() override;
void kill() override;
- QProcess::ProcessState state() const override;
Utils::ProcessResultData resultData() const override;
QByteArray readAllStandardOutput() override;