From c5555035f1a52c58d9b91a68900d900c532a3c15 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Mon, 11 Sep 2023 19:22:04 +0200 Subject: [PATCH] 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 e8ca1877de7f5cc6fec940551b3a13745170bcb0 Fixes: QTCREATORBUG-29457 Change-Id: Ief360c123f6284c7df105ef530c4602555b5b069 Reviewed-by: Reviewed-by: Christian Kandeler --- src/libs/utils/processutils.cpp | 43 +++++++++++++++++++++------------ src/libs/utils/processutils.h | 5 ++-- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/libs/utils/processutils.cpp b/src/libs/utils/processutils.cpp index c5fc3d1ade7..1c4f988fc51 100644 --- a/src/libs/utils/processutils.cpp +++ b/src/libs/utils/processutils.cpp @@ -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 diff --git a/src/libs/utils/processutils.h b/src/libs/utils/processutils.h index 89202c0daf2..c2a864db1fb 100644 --- a/src/libs/utils/processutils.h +++ b/src/libs/utils/processutils.h @@ -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;