forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
@@ -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.
|
||||
|
@@ -38,8 +38,6 @@ namespace Utils {
|
||||
class QTCREATOR_UTILS_EXPORT ProcessSetupData
|
||||
{
|
||||
public:
|
||||
using Ptr = std::shared_ptr<ProcessSetupData>;
|
||||
|
||||
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,
|
||||
|
@@ -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));
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user