diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 87ba8856bcb..9a6197fae39 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -251,6 +251,10 @@ public: virtual bool waitForReadyRead(int msecs) = 0; virtual bool waitForFinished(int msecs) = 0; + virtual void kickoffProcess() { QTC_CHECK(false); } + virtual void interruptProcess() { QTC_CHECK(false); } + virtual qint64 applicationMainThreadID() const { QTC_CHECK(false); return -1; } + void setLowPriority() { m_lowPriority = true; } bool isLowPriority() const { return m_lowPriority; } void setUnixTerminalDisabled() { m_unixTerminalDisabled = true; } @@ -351,6 +355,10 @@ public: // intentionally no-op without an assert bool waitForFinished(int msecs) override { return false; } + void kickoffProcess() override { m_terminal.kickoffProcess(); } + void interruptProcess() override { m_terminal.interruptProcess(); } + qint64 applicationMainThreadID() const override { return m_terminal.applicationMainThreadID(); } + private: Internal::TerminalProcess m_terminal; }; @@ -1151,6 +1159,21 @@ Environment QtcProcess::systemEnvironmentForBinary(const FilePath &filePath) return Environment::systemEnvironment(); } +void QtcProcess::kickoffProcess() +{ + d->m_process->kickoffProcess(); +} + +void QtcProcess::interruptProcess() +{ + d->m_process->interruptProcess(); +} + +qint64 QtcProcess::applicationMainThreadID() const +{ + return d->m_process->applicationMainThreadID(); +} + void QtcProcess::setProcessChannelMode(QProcess::ProcessChannelMode mode) { d->m_process->setProcessChannelMode(mode); diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 63b9d65ea5b..46693a7df4e 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -181,6 +181,10 @@ public: static Environment systemEnvironmentForBinary(const FilePath &filePath); + void kickoffProcess(); + void interruptProcess(); + qint64 applicationMainThreadID() const; + // FIXME: Cut down the following bits inherited from QProcess and QIODevice. void setProcessChannelMode(QProcess::ProcessChannelMode mode); diff --git a/src/plugins/debugger/terminal.cpp b/src/plugins/debugger/terminal.cpp index 3cd56dbe62d..1856e7620b0 100644 --- a/src/plugins/debugger/terminal.cpp +++ b/src/plugins/debugger/terminal.cpp @@ -25,12 +25,13 @@ #include "terminal.h" -#include - #include -#include +#include + #include +#include +#include #include #include @@ -173,23 +174,18 @@ TerminalRunner::TerminalRunner(RunControl *runControl, : RunWorker(runControl), m_stubRunnable(stubRunnable) { setId("TerminalRunner"); - - connect(&m_stubProc, &ConsoleProcess::errorOccurred, - this, &TerminalRunner::stubError); - connect(&m_stubProc, &ConsoleProcess::started, - this, &TerminalRunner::stubStarted); - connect(&m_stubProc, &ConsoleProcess::finished, - this, &TerminalRunner::reportDone); } void TerminalRunner::kickoffProcess() { - m_stubProc.kickoffProcess(); + if (m_stubProc) + m_stubProc->kickoffProcess(); } void TerminalRunner::interruptProcess() { - m_stubProc.interruptProcess(); + if (m_stubProc) + m_stubProc->interruptProcess(); } void TerminalRunner::setRunAsRoot(bool on) @@ -200,39 +196,53 @@ void TerminalRunner::setRunAsRoot(bool on) void TerminalRunner::start() { QTC_ASSERT(m_stubRunnable, reportFailure({}); return); + QTC_ASSERT(!m_stubProc, reportFailure({}); return); Runnable stub = m_stubRunnable(); - if (m_runAsRoot) { - m_stubProc.setRunAsRoot(true); + const QtcProcess::TerminalMode terminalMode = HostOsInfo::isWindowsHost() + ? QtcProcess::TerminalSuspend : QtcProcess::TerminalDebug; + m_stubProc = new QtcProcess(terminalMode, this); + connect(m_stubProc, &QtcProcess::errorOccurred, + this, &TerminalRunner::stubError); + connect(m_stubProc, &QtcProcess::started, + this, &TerminalRunner::stubStarted); + connect(m_stubProc, &QtcProcess::finished, + this, &TerminalRunner::reportDone); + + CommandLine commandLine = stub.command; + if (m_runAsRoot) { // TODO: fix me + m_stubProc->setRunAsRoot(true); +// CommandLine wrapped("sudo", {"-A"}); +// wrapped.addCommandLineAsArgs(commandLine); +// commandLine = wrapped; RunControl::provideAskPassEntry(stub.environment); } - m_stubProc.setEnvironment(stub.environment); - m_stubProc.setWorkingDirectory(stub.workingDirectory); - m_stubProc.setMode(HostOsInfo::isWindowsHost() ? ConsoleProcess::Suspend - : ConsoleProcess::Debug); + m_stubProc->setEnvironment(stub.environment); + m_stubProc->setWorkingDirectory(stub.workingDirectory); // Error message for user is delivered via a signal. - m_stubProc.setCommand(stub.command); - m_stubProc.start(); + m_stubProc->setCommand(commandLine); + m_stubProc->start(); } void TerminalRunner::stop() { - m_stubProc.stopProcess(); + if (m_stubProc) + m_stubProc->stopProcess(); reportStopped(); } void TerminalRunner::stubStarted() { - m_applicationPid = m_stubProc.processId(); - m_applicationMainThreadId = m_stubProc.applicationMainThreadID(); + m_applicationPid = m_stubProc->processId(); + m_applicationMainThreadId = m_stubProc->applicationMainThreadID(); reportStarted(); } void TerminalRunner::stubError() { - reportFailure(m_stubProc.errorString()); + reportFailure(m_stubProc->errorString()); } } // namespace Internal diff --git a/src/plugins/debugger/terminal.h b/src/plugins/debugger/terminal.h index ee6ce49faec..4d3679f31ab 100644 --- a/src/plugins/debugger/terminal.h +++ b/src/plugins/debugger/terminal.h @@ -30,7 +30,7 @@ #include -#include +namespace Utils { class QtcProcess; } namespace Debugger { @@ -88,7 +88,7 @@ private: void stubStarted(); void stubError(); - Utils::ConsoleProcess m_stubProc; + Utils::QtcProcess *m_stubProc = nullptr; std::function m_stubRunnable; qint64 m_applicationPid = 0; qint64 m_applicationMainThreadId = 0;