ProcessInterface: Get rid of ProcessInterface::Ptr

Keep the setup data on stack instead on heap.

Task-number: QTCREATORBUG-27358
Change-Id: I0fffd525e2bd4f46533804e3b88fe5b330d02a91
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2022-04-12 08:50:46 +02:00
parent bdbfa4ba0d
commit bc30523293
5 changed files with 58 additions and 60 deletions

View File

@@ -374,7 +374,7 @@ QStringList CallerHandle::arguments() const
return m_arguments; return m_arguments;
} }
void CallerHandle::setProcessSetupData(const ProcessSetupData::Ptr &setup) void CallerHandle::setProcessSetupData(ProcessSetupData *setup)
{ {
QTC_ASSERT(isCalledFromCallersThread(), return); QTC_ASSERT(isCalledFromCallersThread(), return);
m_setup = setup; m_setup = setup;

View File

@@ -105,7 +105,7 @@ public:
QString program() const; QString program() const;
// Called from caller's or launcher's thread. // Called from caller's or launcher's thread.
QStringList arguments() const; QStringList arguments() const;
void setProcessSetupData(const ProcessSetupData::Ptr &setup); void setProcessSetupData(ProcessSetupData *setup);
signals: signals:
void started(qint64 processId, qint64 applicationMainThreadId = 0); void started(qint64 processId, qint64 applicationMainThreadId = 0);
@@ -152,7 +152,7 @@ private:
QString m_command; QString m_command;
QStringList m_arguments; QStringList m_arguments;
ProcessSetupData::Ptr m_setup; ProcessSetupData *m_setup = nullptr;
}; };
// Moved to the launcher thread, returned to caller's thread. // Moved to the launcher thread, returned to caller's thread.

View File

@@ -38,8 +38,6 @@ namespace Utils {
class QTCREATOR_UTILS_EXPORT ProcessSetupData class QTCREATOR_UTILS_EXPORT ProcessSetupData
{ {
public: public:
using Ptr = std::shared_ptr<ProcessSetupData>;
ProcessImpl m_processImpl = ProcessImpl::Default; ProcessImpl m_processImpl = ProcessImpl::Default;
ProcessMode m_processMode = ProcessMode::Reader; ProcessMode m_processMode = ProcessMode::Reader;
TerminalMode m_terminalMode = TerminalMode::Off; TerminalMode m_terminalMode = TerminalMode::Off;
@@ -83,7 +81,7 @@ class QTCREATOR_UTILS_EXPORT ProcessInterface : public QObject
Q_OBJECT Q_OBJECT
public: public:
ProcessInterface(QObject *parent = nullptr) : QObject(parent), m_setup(new ProcessSetupData) {} ProcessInterface(QObject *parent = nullptr) : QObject(parent) {}
signals: signals:
// This should be emitted when being in Starting state only. // This should be emitted when being in Starting state only.
@@ -99,7 +97,7 @@ signals:
void done(const Utils::ProcessResultData &resultData); void done(const Utils::ProcessResultData &resultData);
protected: protected:
ProcessSetupData::Ptr m_setup; ProcessSetupData m_setup;
private: private:
// It's being called only in Starting state. Just before this method is being called, // It's being called only in Starting state. Just before this method is being called,

View File

@@ -245,7 +245,7 @@ void DefaultImpl::start()
<< "Process " << currentNumber << " starting (" << "Process " << currentNumber << " starting ("
<< qPrintable(blockingMessage(property(QTC_PROCESS_BLOCKING_TYPE))) << qPrintable(blockingMessage(property(QTC_PROCESS_BLOCKING_TYPE)))
<< "): " << "): "
<< m_setup->m_commandLine.toUserOutput(); << m_setup.m_commandLine.toUserOutput();
setProperty(QTC_PROCESS_NUMBER, currentNumber); setProperty(QTC_PROCESS_NUMBER, currentNumber);
} }
@@ -260,26 +260,26 @@ void DefaultImpl::start()
bool DefaultImpl::dissolveCommand(QString *program, QStringList *arguments) bool DefaultImpl::dissolveCommand(QString *program, QStringList *arguments)
{ {
const CommandLine &commandLine = m_setup->m_commandLine; const CommandLine &commandLine = m_setup.m_commandLine;
QString commandString; QString commandString;
ProcessArgs processArgs; ProcessArgs processArgs;
const bool success = ProcessArgs::prepareCommand(commandLine, &commandString, &processArgs, const bool success = ProcessArgs::prepareCommand(commandLine, &commandString, &processArgs,
&m_setup->m_environment, &m_setup.m_environment,
&m_setup->m_workingDirectory); &m_setup.m_workingDirectory);
if (commandLine.executable().osType() == OsTypeWindows) { if (commandLine.executable().osType() == OsTypeWindows) {
QString args; QString args;
if (m_setup->m_useCtrlCStub) { if (m_setup.m_useCtrlCStub) {
if (m_setup->m_lowPriority) if (m_setup.m_lowPriority)
ProcessArgs::addArg(&args, "-nice"); ProcessArgs::addArg(&args, "-nice");
ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString)); ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString));
commandString = QCoreApplication::applicationDirPath() commandString = QCoreApplication::applicationDirPath()
+ QLatin1String("/qtcreator_ctrlc_stub.exe"); + QLatin1String("/qtcreator_ctrlc_stub.exe");
} else if (m_setup->m_lowPriority) { } else if (m_setup.m_lowPriority) {
m_setup->m_belowNormalPriority = true; m_setup.m_belowNormalPriority = true;
} }
ProcessArgs::addArgs(&args, processArgs.toWindowsArgs()); ProcessArgs::addArgs(&args, processArgs.toWindowsArgs());
m_setup->m_nativeArguments = args; m_setup.m_nativeArguments = args;
// Note: Arguments set with setNativeArgs will be appended to the ones // Note: Arguments set with setNativeArgs will be appended to the ones
// passed with start() below. // passed with start() below.
*arguments = QStringList(); *arguments = QStringList();
@@ -309,7 +309,7 @@ static FilePath resolve(const FilePath &workingDir, const FilePath &filePath)
bool DefaultImpl::ensureProgramExists(const QString &program) bool DefaultImpl::ensureProgramExists(const QString &program)
{ {
const FilePath programFilePath = resolve(m_setup->m_workingDirectory, const FilePath programFilePath = resolve(m_setup.m_workingDirectory,
FilePath::fromString(program)); FilePath::fromString(program));
if (programFilePath.exists() && programFilePath.isExecutableFile()) if (programFilePath.exists() && programFilePath.isExecutableFile())
return true; return true;
@@ -370,19 +370,19 @@ private:
void doDefaultStart(const QString &program, const QStringList &arguments) final void doDefaultStart(const QString &program, const QStringList &arguments) final
{ {
ProcessStartHandler *handler = m_process->processStartHandler(); ProcessStartHandler *handler = m_process->processStartHandler();
handler->setProcessMode(m_setup->m_processMode); handler->setProcessMode(m_setup.m_processMode);
handler->setWriteData(m_setup->m_writeData); handler->setWriteData(m_setup.m_writeData);
if (m_setup->m_belowNormalPriority) if (m_setup.m_belowNormalPriority)
handler->setBelowNormalPriority(); handler->setBelowNormalPriority();
handler->setNativeArguments(m_setup->m_nativeArguments); handler->setNativeArguments(m_setup.m_nativeArguments);
m_process->setProcessEnvironment(m_setup->m_environment.toProcessEnvironment()); m_process->setProcessEnvironment(m_setup.m_environment.toProcessEnvironment());
m_process->setWorkingDirectory(m_setup->m_workingDirectory.path()); m_process->setWorkingDirectory(m_setup.m_workingDirectory.path());
m_process->setStandardInputFile(m_setup->m_standardInputFile); m_process->setStandardInputFile(m_setup.m_standardInputFile);
if (m_setup->m_lowPriority) if (m_setup.m_lowPriority)
m_process->setLowPriority(); m_process->setLowPriority();
if (m_setup->m_unixTerminalDisabled) if (m_setup.m_unixTerminalDisabled)
m_process->setUnixTerminalDisabled(); m_process->setUnixTerminalDisabled();
m_process->setUseCtrlCStub(m_setup->m_useCtrlCStub); m_process->setUseCtrlCStub(m_setup.m_useCtrlCStub);
m_process->start(program, arguments, handler->openMode()); m_process->start(program, arguments, handler->openMode());
handler->handleProcessStart(); handler->handleProcessStart();
} }
@@ -425,7 +425,7 @@ public:
ProcessLauncherImpl() : m_token(uniqueToken()) ProcessLauncherImpl() : m_token(uniqueToken())
{ {
m_handle = LauncherInterface::registerHandle(this, token()); m_handle = LauncherInterface::registerHandle(this, token());
m_handle->setProcessSetupData(m_setup); m_handle->setProcessSetupData(&m_setup);
connect(m_handle, &CallerHandle::started, connect(m_handle, &CallerHandle::started,
this, &ProcessInterface::started); this, &ProcessInterface::started);
connect(m_handle, &CallerHandle::readyRead, connect(m_handle, &CallerHandle::readyRead,
@@ -451,7 +451,7 @@ private:
m_handle->kill(); m_handle->kill();
break; break;
case ControlSignal::Interrupt: case ControlSignal::Interrupt:
if (m_setup->m_useCtrlCStub) // bypass launcher and interrupt directly if (m_setup.m_useCtrlCStub) // bypass launcher and interrupt directly
ProcessHelper::interruptPid(m_handle->processId()); ProcessHelper::interruptPid(m_handle->processId());
break; break;
case ControlSignal::KickOff: case ControlSignal::KickOff:
@@ -799,9 +799,9 @@ void QtcProcess::start()
QTC_ASSERT(processImpl, return); QTC_ASSERT(processImpl, return);
d->clearForRun(); d->clearForRun();
d->setProcessInterface(processImpl); d->setProcessInterface(processImpl);
*d->m_process->m_setup = d->m_setup; d->m_process->m_setup = d->m_setup;
d->m_process->m_setup->m_commandLine = d->fullCommandLine(); d->m_process->m_setup.m_commandLine = d->fullCommandLine();
d->m_process->m_setup->m_environment = d->fullEnvironment(); d->m_process->m_setup.m_environment = d->fullEnvironment();
if (processLog().isDebugEnabled()) { if (processLog().isDebugEnabled()) {
// Pass a dynamic property with info about blocking type // Pass a dynamic property with info about blocking type
d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE)); d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE));

View File

@@ -174,13 +174,13 @@ void TerminalImpl::start()
QString pcmd; QString pcmd;
QString pargs; QString pargs;
if (m_setup->m_terminalMode != TerminalMode::Run) { // The debugger engines already pre-process the arguments. if (m_setup.m_terminalMode != TerminalMode::Run) { // The debugger engines already pre-process the arguments.
pcmd = m_setup->m_commandLine.executable().toString(); pcmd = m_setup.m_commandLine.executable().toString();
pargs = m_setup->m_commandLine.arguments(); pargs = m_setup.m_commandLine.arguments();
} else { } else {
ProcessArgs outArgs; ProcessArgs outArgs;
ProcessArgs::prepareCommand(m_setup->m_commandLine, &pcmd, &outArgs, ProcessArgs::prepareCommand(m_setup.m_commandLine, &pcmd, &outArgs,
&m_setup->m_environment, &m_setup->m_workingDirectory); &m_setup.m_environment, &m_setup.m_workingDirectory);
pargs = outArgs.toWindowsArgs(); pargs = outArgs.toWindowsArgs();
} }
@@ -190,7 +190,7 @@ void TerminalImpl::start()
return; return;
} }
QStringList env = m_setup->m_environment.toStringList(); QStringList env = m_setup.m_environment.toStringList();
if (!env.isEmpty()) { if (!env.isEmpty()) {
d->m_tempFile = new QTemporaryFile(); d->m_tempFile = new QTemporaryFile();
if (!d->m_tempFile->open()) { if (!d->m_tempFile->open()) {
@@ -237,7 +237,7 @@ void TerminalImpl::start()
d->m_pid = new PROCESS_INFORMATION; d->m_pid = new PROCESS_INFORMATION;
ZeroMemory(d->m_pid, sizeof(PROCESS_INFORMATION)); ZeroMemory(d->m_pid, sizeof(PROCESS_INFORMATION));
QString workDir = m_setup->m_workingDirectory.toUserOutput(); QString workDir = m_setup.m_workingDirectory.toUserOutput();
if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\'))) if (!workDir.isEmpty() && !workDir.endsWith(QLatin1Char('\\')))
workDir.append(QLatin1Char('\\')); workDir.append(QLatin1Char('\\'));
@@ -293,7 +293,7 @@ void TerminalImpl::start()
}; };
QStringList stubArgs; QStringList stubArgs;
stubArgs << modeOption(m_setup->m_terminalMode) stubArgs << modeOption(m_setup.m_terminalMode)
<< d->m_stubServer.fullServerName() << d->m_stubServer.fullServerName()
<< workDir << workDir
<< (d->m_tempFile ? d->m_tempFile->fileName() : QString()) << (d->m_tempFile ? d->m_tempFile->fileName() : QString())
@@ -324,22 +324,22 @@ void TerminalImpl::start()
#else #else
ProcessArgs::SplitError perr; ProcessArgs::SplitError perr;
ProcessArgs pargs = ProcessArgs::prepareArgs(m_setup->m_commandLine.arguments(), ProcessArgs pargs = ProcessArgs::prepareArgs(m_setup.m_commandLine.arguments(),
&perr, &perr,
HostOsInfo::hostOs(), HostOsInfo::hostOs(),
&m_setup->m_environment, &m_setup.m_environment,
&m_setup->m_workingDirectory, &m_setup.m_workingDirectory,
m_setup->m_abortOnMetaChars); m_setup.m_abortOnMetaChars);
QString pcmd; QString pcmd;
if (perr == ProcessArgs::SplitOk) { if (perr == ProcessArgs::SplitOk) {
pcmd = m_setup->m_commandLine.executable().toString(); pcmd = m_setup.m_commandLine.executable().toString();
} else { } else {
if (perr != ProcessArgs::FoundMeta) { if (perr != ProcessArgs::FoundMeta) {
emitError(QProcess::FailedToStart, tr("Quoting error in command.")); emitError(QProcess::FailedToStart, tr("Quoting error in command."));
return; return;
} }
if (m_setup->m_terminalMode == TerminalMode::Debug) { if (m_setup.m_terminalMode == TerminalMode::Debug) {
// FIXME: QTCREATORBUG-2809 // FIXME: QTCREATORBUG-2809
emitError(QProcess::FailedToStart, tr("Debugging complex shell commands in a terminal" emitError(QProcess::FailedToStart, tr("Debugging complex shell commands in a terminal"
" is currently not supported.")); " is currently not supported."));
@@ -347,8 +347,8 @@ void TerminalImpl::start()
} }
pcmd = qEnvironmentVariable("SHELL", "/bin/sh"); pcmd = qEnvironmentVariable("SHELL", "/bin/sh");
pargs = ProcessArgs::createUnixArgs( pargs = ProcessArgs::createUnixArgs(
{"-c", (ProcessArgs::quoteArg(m_setup->m_commandLine.executable().toString()) {"-c", (ProcessArgs::quoteArg(m_setup.m_commandLine.executable().toString())
+ ' ' + m_setup->m_commandLine.arguments())}); + ' ' + m_setup.m_commandLine.arguments())});
} }
ProcessArgs::SplitError qerr; ProcessArgs::SplitError qerr;
@@ -356,8 +356,8 @@ void TerminalImpl::start()
const ProcessArgs terminalArgs = ProcessArgs::prepareArgs(terminal.executeArgs, const ProcessArgs terminalArgs = ProcessArgs::prepareArgs(terminal.executeArgs,
&qerr, &qerr,
HostOsInfo::hostOs(), HostOsInfo::hostOs(),
&m_setup->m_environment, &m_setup.m_environment,
&m_setup->m_workingDirectory); &m_setup.m_workingDirectory);
if (qerr != ProcessArgs::SplitOk) { if (qerr != ProcessArgs::SplitOk) {
emitError(QProcess::FailedToStart, qerr == ProcessArgs::BadQuoting emitError(QProcess::FailedToStart, qerr == ProcessArgs::BadQuoting
? tr("Quoting error in terminal command.") ? tr("Quoting error in terminal command.")
@@ -371,9 +371,9 @@ void TerminalImpl::start()
return; return;
} }
m_setup->m_environment.unset(QLatin1String("TERM")); m_setup.m_environment.unset(QLatin1String("TERM"));
const QStringList env = m_setup->m_environment.toStringList(); const QStringList env = m_setup.m_environment.toStringList();
if (!env.isEmpty()) { if (!env.isEmpty()) {
d->m_tempFile = new QTemporaryFile(); d->m_tempFile = new QTemporaryFile();
if (!d->m_tempFile->open()) { if (!d->m_tempFile->open()) {
@@ -397,10 +397,10 @@ void TerminalImpl::start()
QStringList allArgs = terminalArgs.toUnixArgs(); QStringList allArgs = terminalArgs.toUnixArgs();
allArgs << stubPath allArgs << stubPath
<< modeOption(m_setup->m_terminalMode) << modeOption(m_setup.m_terminalMode)
<< d->m_stubServer.fullServerName() << d->m_stubServer.fullServerName()
<< msgPromptToClose() << msgPromptToClose()
<< m_setup->m_workingDirectory.path() << m_setup.m_workingDirectory.path()
<< (d->m_tempFile ? d->m_tempFile->fileName() : QString()) << (d->m_tempFile ? d->m_tempFile->fileName() : QString())
<< QString::number(getpid()) << QString::number(getpid())
<< pcmd << pcmd
@@ -409,9 +409,9 @@ void TerminalImpl::start()
if (terminal.needsQuotes) if (terminal.needsQuotes)
allArgs = QStringList { ProcessArgs::joinArgs(allArgs) }; allArgs = QStringList { ProcessArgs::joinArgs(allArgs) };
d->m_process.setEnvironment(m_setup->m_environment); d->m_process.setEnvironment(m_setup.m_environment);
d->m_process.setCommand({FilePath::fromString(terminal.command), allArgs}); d->m_process.setCommand({FilePath::fromString(terminal.command), allArgs});
d->m_process.setProcessImpl(m_setup->m_processImpl); d->m_process.setProcessImpl(m_setup.m_processImpl);
d->m_process.start(); d->m_process.start();
if (!d->m_process.waitForStarted()) { if (!d->m_process.waitForStarted()) {
const QString msg = tr("Cannot start the terminal emulator \"%1\", change the setting in the " const QString msg = tr("Cannot start the terminal emulator \"%1\", change the setting in the "
@@ -606,10 +606,10 @@ void TerminalImpl::readStubOutput()
out.chop(2); // \r\n out.chop(2); // \r\n
if (out.startsWith("err:chdir ")) { if (out.startsWith("err:chdir ")) {
emitError(QProcess::FailedToStart, emitError(QProcess::FailedToStart,
msgCannotChangeToWorkDir(m_setup->m_workingDirectory, winErrorMessage(out.mid(10).toInt()))); msgCannotChangeToWorkDir(m_setup.m_workingDirectory, winErrorMessage(out.mid(10).toInt())));
} else if (out.startsWith("err:exec ")) { } else if (out.startsWith("err:exec ")) {
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 // TODO: ensure that it comes before "pid " comes
d->m_appMainThreadId = out.mid(7).toLongLong(); d->m_appMainThreadId = out.mid(7).toLongLong();
@@ -649,10 +649,10 @@ void TerminalImpl::readStubOutput()
out.chop(1); // \n out.chop(1); // \n
if (out.startsWith("err:chdir ")) { if (out.startsWith("err:chdir ")) {
emitError(QProcess::FailedToStart, emitError(QProcess::FailedToStart,
msgCannotChangeToWorkDir(m_setup->m_workingDirectory, errorMsg(out.mid(10).toInt()))); msgCannotChangeToWorkDir(m_setup.m_workingDirectory, errorMsg(out.mid(10).toInt())));
} else if (out.startsWith("err:exec ")) { } else if (out.startsWith("err:exec ")) {
emitError(QProcess::FailedToStart, emitError(QProcess::FailedToStart,
msgCannotExecute(m_setup->m_commandLine.executable().toString(), errorMsg(out.mid(9).toInt()))); msgCannotExecute(m_setup.m_commandLine.executable().toString(), errorMsg(out.mid(9).toInt())));
} else if (out.startsWith("spid ")) { } else if (out.startsWith("spid ")) {
delete d->m_tempFile; delete d->m_tempFile;
d->m_tempFile = nullptr; d->m_tempFile = nullptr;