ProcessHelper: Fix setChildProcessModifier()

The original change that introduced the usage of
QProcess::UnixProcessFlag introduced also a regression.
Since ProcessHelper::setLowPriority() and setUnixTerminalDisabled()
are part of public API, we can't use m_lowPriority and
m_unixTerminalDisabled inside c'tor for early return before setting the
setChildProcessModifier(), because these values may be changed later,
before starting the process.

Amends e8ca1877de

Fixes: QTCREATORBUG-29457
Change-Id: Ief360c123f6284c7df105ef530c4602555b5b069
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Jarek Kobus
2023-09-11 19:22:04 +02:00
parent 6916358497
commit c5555035f1
2 changed files with 31 additions and 17 deletions

View File

@@ -105,19 +105,35 @@ BOOL CALLBACK sendInterruptMessageToAllWindowsOfProcess_enumWnd(HWND hwnd, LPARA
ProcessHelper::ProcessHelper(QObject *parent)
: QProcess(parent), m_processStartHandler(this)
{}
void ProcessHelper::setLowPriority()
{
m_lowPriority = true;
enableChildProcessModifier();
}
void ProcessHelper::setUnixTerminalDisabled()
{
#if defined(Q_OS_UNIX)
bool needSetsid = m_unixTerminalDisabled;
# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
if (needSetsid) {
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
needSetsid = false;
}
# if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
m_unixTerminalDisabled = true;
enableChildProcessModifier();
# else
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
# endif
#endif
}
if (!m_lowPriority && !needSetsid)
return;
setChildProcessModifier([=, this] {
void ProcessHelper::setUseCtrlCStub(bool enabled)
{
m_useCtrlCStub = enabled;
}
void ProcessHelper::enableChildProcessModifier()
{
#if defined(Q_OS_UNIX)
setChildProcessModifier([this] {
// nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest
if (m_lowPriority) {
errno = 0;
@@ -125,18 +141,15 @@ ProcessHelper::ProcessHelper(QObject *parent)
perror("Failed to set nice value");
}
# if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
// Disable terminal by becoming a session leader.
if (needSetsid)
if (m_unixTerminalDisabled)
setsid();
# endif
});
#endif
}
void ProcessHelper::setUseCtrlCStub(bool enabled)
{
m_useCtrlCStub = enabled;
}
void ProcessHelper::terminateProcess()
{
#ifdef Q_OS_WIN

View File

@@ -40,8 +40,8 @@ public:
using QProcess::setErrorString;
void setLowPriority() { m_lowPriority = true; }
void setUnixTerminalDisabled() { m_unixTerminalDisabled = true; }
void setLowPriority();
void setUnixTerminalDisabled();
void setUseCtrlCStub(bool enabled); // release only
static void terminateProcess(QProcess *process);
@@ -49,6 +49,7 @@ public:
static void interruptPid(qint64 pid);
private:
void enableChildProcessModifier();
void terminateProcess();
bool m_lowPriority = false;