diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index 9f8b5e62b72..531a1ab5400 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -374,7 +374,7 @@ QStringList CallerHandle::arguments() const return m_arguments; } -void CallerHandle::setProcessSetupData(const ProcessSetupData::Ptr &setup) +void CallerHandle::setProcessSetupData(ProcessSetupData *setup) { QTC_ASSERT(isCalledFromCallersThread(), return); m_setup = setup; diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index 69afd438862..6d89a4e100d 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -105,7 +105,7 @@ public: QString program() const; // Called from caller's or launcher's thread. QStringList arguments() const; - void setProcessSetupData(const ProcessSetupData::Ptr &setup); + void setProcessSetupData(ProcessSetupData *setup); signals: void started(qint64 processId, qint64 applicationMainThreadId = 0); @@ -152,7 +152,7 @@ private: QString m_command; QStringList m_arguments; - ProcessSetupData::Ptr m_setup; + ProcessSetupData *m_setup = nullptr; }; // Moved to the launcher thread, returned to caller's thread. diff --git a/src/libs/utils/processinterface.h b/src/libs/utils/processinterface.h index 627dd2cee19..65eab71897a 100644 --- a/src/libs/utils/processinterface.h +++ b/src/libs/utils/processinterface.h @@ -38,8 +38,6 @@ namespace Utils { class QTCREATOR_UTILS_EXPORT ProcessSetupData { public: - using Ptr = std::shared_ptr; - ProcessImpl m_processImpl = ProcessImpl::Default; ProcessMode m_processMode = ProcessMode::Reader; TerminalMode m_terminalMode = TerminalMode::Off; @@ -83,7 +81,7 @@ class QTCREATOR_UTILS_EXPORT ProcessInterface : public QObject Q_OBJECT public: - ProcessInterface(QObject *parent = nullptr) : QObject(parent), m_setup(new ProcessSetupData) {} + ProcessInterface(QObject *parent = nullptr) : QObject(parent) {} signals: // This should be emitted when being in Starting state only. @@ -99,7 +97,7 @@ signals: void done(const Utils::ProcessResultData &resultData); protected: - ProcessSetupData::Ptr m_setup; + ProcessSetupData m_setup; private: // It's being called only in Starting state. Just before this method is being called, diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 9e2fee9bb36..7fe4bd2b898 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -245,7 +245,7 @@ void DefaultImpl::start() << "Process " << currentNumber << " starting (" << qPrintable(blockingMessage(property(QTC_PROCESS_BLOCKING_TYPE))) << "): " - << m_setup->m_commandLine.toUserOutput(); + << m_setup.m_commandLine.toUserOutput(); setProperty(QTC_PROCESS_NUMBER, currentNumber); } @@ -260,26 +260,26 @@ void DefaultImpl::start() bool DefaultImpl::dissolveCommand(QString *program, QStringList *arguments) { - const CommandLine &commandLine = m_setup->m_commandLine; + const CommandLine &commandLine = m_setup.m_commandLine; QString commandString; ProcessArgs processArgs; const bool success = ProcessArgs::prepareCommand(commandLine, &commandString, &processArgs, - &m_setup->m_environment, - &m_setup->m_workingDirectory); + &m_setup.m_environment, + &m_setup.m_workingDirectory); if (commandLine.executable().osType() == OsTypeWindows) { QString args; - if (m_setup->m_useCtrlCStub) { - if (m_setup->m_lowPriority) + if (m_setup.m_useCtrlCStub) { + if (m_setup.m_lowPriority) ProcessArgs::addArg(&args, "-nice"); ProcessArgs::addArg(&args, QDir::toNativeSeparators(commandString)); commandString = QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_ctrlc_stub.exe"); - } else if (m_setup->m_lowPriority) { - m_setup->m_belowNormalPriority = true; + } else if (m_setup.m_lowPriority) { + m_setup.m_belowNormalPriority = true; } 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 // passed with start() below. *arguments = QStringList(); @@ -309,7 +309,7 @@ static FilePath resolve(const FilePath &workingDir, const FilePath &filePath) 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)); if (programFilePath.exists() && programFilePath.isExecutableFile()) return true; @@ -370,19 +370,19 @@ private: void doDefaultStart(const QString &program, const QStringList &arguments) final { ProcessStartHandler *handler = m_process->processStartHandler(); - handler->setProcessMode(m_setup->m_processMode); - handler->setWriteData(m_setup->m_writeData); - if (m_setup->m_belowNormalPriority) + handler->setProcessMode(m_setup.m_processMode); + handler->setWriteData(m_setup.m_writeData); + if (m_setup.m_belowNormalPriority) handler->setBelowNormalPriority(); - handler->setNativeArguments(m_setup->m_nativeArguments); - m_process->setProcessEnvironment(m_setup->m_environment.toProcessEnvironment()); - m_process->setWorkingDirectory(m_setup->m_workingDirectory.path()); - m_process->setStandardInputFile(m_setup->m_standardInputFile); - if (m_setup->m_lowPriority) + handler->setNativeArguments(m_setup.m_nativeArguments); + m_process->setProcessEnvironment(m_setup.m_environment.toProcessEnvironment()); + m_process->setWorkingDirectory(m_setup.m_workingDirectory.path()); + m_process->setStandardInputFile(m_setup.m_standardInputFile); + if (m_setup.m_lowPriority) m_process->setLowPriority(); - if (m_setup->m_unixTerminalDisabled) + if (m_setup.m_unixTerminalDisabled) m_process->setUnixTerminalDisabled(); - m_process->setUseCtrlCStub(m_setup->m_useCtrlCStub); + m_process->setUseCtrlCStub(m_setup.m_useCtrlCStub); m_process->start(program, arguments, handler->openMode()); handler->handleProcessStart(); } @@ -425,7 +425,7 @@ public: ProcessLauncherImpl() : m_token(uniqueToken()) { m_handle = LauncherInterface::registerHandle(this, token()); - m_handle->setProcessSetupData(m_setup); + m_handle->setProcessSetupData(&m_setup); connect(m_handle, &CallerHandle::started, this, &ProcessInterface::started); connect(m_handle, &CallerHandle::readyRead, @@ -451,7 +451,7 @@ private: m_handle->kill(); break; 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()); break; case ControlSignal::KickOff: @@ -799,9 +799,9 @@ void QtcProcess::start() 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(); - d->m_process->m_setup->m_environment = d->fullEnvironment(); + d->m_process->m_setup = d->m_setup; + d->m_process->m_setup.m_commandLine = d->fullCommandLine(); + d->m_process->m_setup.m_environment = d->fullEnvironment(); if (processLog().isDebugEnabled()) { // Pass a dynamic property with info about blocking type d->m_process->setProperty(QTC_PROCESS_BLOCKING_TYPE, property(QTC_PROCESS_BLOCKING_TYPE)); diff --git a/src/libs/utils/terminalprocess.cpp b/src/libs/utils/terminalprocess.cpp index 8c962129efa..28d7b340b5c 100644 --- a/src/libs/utils/terminalprocess.cpp +++ b/src/libs/utils/terminalprocess.cpp @@ -174,13 +174,13 @@ void TerminalImpl::start() QString pcmd; QString pargs; - if (m_setup->m_terminalMode != TerminalMode::Run) { // The debugger engines already pre-process the arguments. - pcmd = m_setup->m_commandLine.executable().toString(); - pargs = m_setup->m_commandLine.arguments(); + if (m_setup.m_terminalMode != TerminalMode::Run) { // The debugger engines already pre-process the arguments. + pcmd = m_setup.m_commandLine.executable().toString(); + pargs = m_setup.m_commandLine.arguments(); } else { ProcessArgs outArgs; - ProcessArgs::prepareCommand(m_setup->m_commandLine, &pcmd, &outArgs, - &m_setup->m_environment, &m_setup->m_workingDirectory); + ProcessArgs::prepareCommand(m_setup.m_commandLine, &pcmd, &outArgs, + &m_setup.m_environment, &m_setup.m_workingDirectory); pargs = outArgs.toWindowsArgs(); } @@ -190,7 +190,7 @@ void TerminalImpl::start() return; } - QStringList env = m_setup->m_environment.toStringList(); + QStringList env = m_setup.m_environment.toStringList(); if (!env.isEmpty()) { d->m_tempFile = new QTemporaryFile(); if (!d->m_tempFile->open()) { @@ -237,7 +237,7 @@ void TerminalImpl::start() d->m_pid = new 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('\\'))) workDir.append(QLatin1Char('\\')); @@ -293,7 +293,7 @@ void TerminalImpl::start() }; QStringList stubArgs; - stubArgs << modeOption(m_setup->m_terminalMode) + stubArgs << modeOption(m_setup.m_terminalMode) << d->m_stubServer.fullServerName() << workDir << (d->m_tempFile ? d->m_tempFile->fileName() : QString()) @@ -324,22 +324,22 @@ void TerminalImpl::start() #else ProcessArgs::SplitError perr; - ProcessArgs pargs = ProcessArgs::prepareArgs(m_setup->m_commandLine.arguments(), + ProcessArgs pargs = ProcessArgs::prepareArgs(m_setup.m_commandLine.arguments(), &perr, HostOsInfo::hostOs(), - &m_setup->m_environment, - &m_setup->m_workingDirectory, - m_setup->m_abortOnMetaChars); + &m_setup.m_environment, + &m_setup.m_workingDirectory, + m_setup.m_abortOnMetaChars); QString pcmd; if (perr == ProcessArgs::SplitOk) { - pcmd = m_setup->m_commandLine.executable().toString(); + pcmd = m_setup.m_commandLine.executable().toString(); } else { if (perr != ProcessArgs::FoundMeta) { emitError(QProcess::FailedToStart, tr("Quoting error in command.")); return; } - if (m_setup->m_terminalMode == TerminalMode::Debug) { + if (m_setup.m_terminalMode == TerminalMode::Debug) { // FIXME: QTCREATORBUG-2809 emitError(QProcess::FailedToStart, tr("Debugging complex shell commands in a terminal" " is currently not supported.")); @@ -347,8 +347,8 @@ void TerminalImpl::start() } pcmd = qEnvironmentVariable("SHELL", "/bin/sh"); pargs = ProcessArgs::createUnixArgs( - {"-c", (ProcessArgs::quoteArg(m_setup->m_commandLine.executable().toString()) - + ' ' + m_setup->m_commandLine.arguments())}); + {"-c", (ProcessArgs::quoteArg(m_setup.m_commandLine.executable().toString()) + + ' ' + m_setup.m_commandLine.arguments())}); } ProcessArgs::SplitError qerr; @@ -356,8 +356,8 @@ void TerminalImpl::start() const ProcessArgs terminalArgs = ProcessArgs::prepareArgs(terminal.executeArgs, &qerr, HostOsInfo::hostOs(), - &m_setup->m_environment, - &m_setup->m_workingDirectory); + &m_setup.m_environment, + &m_setup.m_workingDirectory); if (qerr != ProcessArgs::SplitOk) { emitError(QProcess::FailedToStart, qerr == ProcessArgs::BadQuoting ? tr("Quoting error in terminal command.") @@ -371,9 +371,9 @@ void TerminalImpl::start() 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()) { d->m_tempFile = new QTemporaryFile(); if (!d->m_tempFile->open()) { @@ -397,10 +397,10 @@ void TerminalImpl::start() QStringList allArgs = terminalArgs.toUnixArgs(); allArgs << stubPath - << modeOption(m_setup->m_terminalMode) + << modeOption(m_setup.m_terminalMode) << d->m_stubServer.fullServerName() << msgPromptToClose() - << m_setup->m_workingDirectory.path() + << m_setup.m_workingDirectory.path() << (d->m_tempFile ? d->m_tempFile->fileName() : QString()) << QString::number(getpid()) << pcmd @@ -409,9 +409,9 @@ void TerminalImpl::start() if (terminal.needsQuotes) 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.setProcessImpl(m_setup->m_processImpl); + d->m_process.setProcessImpl(m_setup.m_processImpl); d->m_process.start(); if (!d->m_process.waitForStarted()) { 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 if (out.startsWith("err:chdir ")) { 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 ")) { 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 // TODO: ensure that it comes before "pid " comes d->m_appMainThreadId = out.mid(7).toLongLong(); @@ -649,10 +649,10 @@ void TerminalImpl::readStubOutput() out.chop(1); // \n if (out.startsWith("err:chdir ")) { 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 ")) { 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 ")) { delete d->m_tempFile; d->m_tempFile = nullptr;