ProcessInterface: Make a copy of ProcessSetupData

Don't share the same instance of data with the QtcProcess
itself, as some of the fields needs to be modified just
for the starting purposes. In this way we avoid cyclic
modifications of the original data on subsequent runs.

Change-Id: I937978ee92f848d247025939ac5b0c6c60c29ff7
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Jarek Kobus
2022-02-15 17:50:33 +01:00
parent 790c1346d9
commit c49ce24a92
2 changed files with 21 additions and 22 deletions

View File

@@ -238,9 +238,9 @@ public:
{ QTC_CHECK(false); } { QTC_CHECK(false); }
void customStart(const CommandLine &command, const Environment &environment) override void customStart(const CommandLine &command, const Environment &environment) override
{ {
m_terminal.setAbortOnMetaChars(m_setup->m_abortOnMetaChars); m_terminal.setAbortOnMetaChars(m_setup.m_abortOnMetaChars);
m_terminal.setCommand(command); m_terminal.setCommand(command);
m_terminal.setWorkingDirectory(m_setup->m_workingDirectory); m_terminal.setWorkingDirectory(m_setup.m_workingDirectory);
m_terminal.setEnvironment(environment); m_terminal.setEnvironment(environment);
m_terminal.start(); m_terminal.start();
} }
@@ -306,17 +306,16 @@ public:
ProcessStartHandler *handler = m_process->processStartHandler(); ProcessStartHandler *handler = m_process->processStartHandler();
handler->setProcessMode(m_processMode); handler->setProcessMode(m_processMode);
handler->setWriteData(writeData); handler->setWriteData(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->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);
m_process->setProcessChannelMode(m_setup->m_procesChannelMode); m_process->setProcessChannelMode(m_setup.m_procesChannelMode);
m_process->setErrorString(m_setup->m_initialErrorString); m_process->setErrorString(m_setup.m_initialErrorString);
m_setup->m_initialErrorString.clear(); 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->start(program, arguments, handler->openMode()); m_process->start(program, arguments, handler->openMode());
handler->handleProcessStart(); handler->handleProcessStart();
@@ -402,17 +401,16 @@ public:
void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) override void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) override
{ {
m_handle->setWorkingDirectory(m_setup->m_workingDirectory); m_handle->setWorkingDirectory(m_setup.m_workingDirectory);
m_handle->setStandardInputFile(m_setup->m_standardInputFile); m_handle->setStandardInputFile(m_setup.m_standardInputFile);
m_handle->setProcessChannelMode(m_setup->m_procesChannelMode); m_handle->setProcessChannelMode(m_setup.m_procesChannelMode);
m_handle->setErrorString(m_setup->m_initialErrorString); m_handle->setErrorString(m_setup.m_initialErrorString);
m_setup->m_initialErrorString.clear(); if (m_setup.m_belowNormalPriority)
if (m_setup->m_belowNormalPriority)
m_handle->setBelowNormalPriority(); m_handle->setBelowNormalPriority();
m_handle->setNativeArguments(m_setup->m_nativeArguments); m_handle->setNativeArguments(m_setup.m_nativeArguments);
if (m_setup->m_lowPriority) if (m_setup.m_lowPriority)
m_handle->setLowPriority(); m_handle->setLowPriority();
if (m_setup->m_unixTerminalDisabled) if (m_setup.m_unixTerminalDisabled)
m_handle->setUnixTerminalDisabled(); m_handle->setUnixTerminalDisabled();
m_handle->start(program, arguments, writeData); m_handle->start(program, arguments, writeData);
} }
@@ -490,7 +488,8 @@ public:
void setProcessInterface(ProcessInterface *process) void setProcessInterface(ProcessInterface *process)
{ {
m_process.reset(process); m_process.reset(process);
m_process->m_setup = &m_setup; m_process->m_setup = m_setup;
m_setup.m_initialErrorString.clear();
m_process->setParent(this); m_process->setParent(this);
connect(m_process.get(), &ProcessInterface::started, connect(m_process.get(), &ProcessInterface::started,

View File

@@ -309,7 +309,7 @@ public:
virtual qint64 applicationMainThreadID() const { QTC_CHECK(false); return -1; } virtual qint64 applicationMainThreadID() const { QTC_CHECK(false); return -1; }
const ProcessMode m_processMode; const ProcessMode m_processMode;
ProcessSetupData *m_setup = nullptr; ProcessSetupData m_setup;
signals: signals:
void started(); void started();