From e8ca1877de7f5cc6fec940551b3a13745170bcb0 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 16 Mar 2023 18:37:25 -0700 Subject: [PATCH] Use Qt 6.7's QProcess::UnixProcessFlag::CreateNewSession Allow QProcess to do the setsid() call for us. Unfortunately, the nice()-setting feature wasn't approved, so we need to keep the modifier for that. Change-Id: Icfe44ecf285a480fafe4fffd174d111b806eb3a8 Reviewed-by: Jarek Kobus --- src/libs/utils/launcherinterface.cpp | 4 ++++ src/libs/utils/processutils.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libs/utils/launcherinterface.cpp b/src/libs/utils/launcherinterface.cpp index 218286521db..d188e224fc1 100644 --- a/src/libs/utils/launcherinterface.cpp +++ b/src/libs/utils/launcherinterface.cpp @@ -82,9 +82,13 @@ void LauncherInterfacePrivate::doStart() connect(m_process, &QProcess::readyReadStandardError, this, &LauncherInterfacePrivate::handleProcessStderr); #ifdef Q_OS_UNIX +# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + m_process->setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession); +# else m_process->setChildProcessModifier([] { setpgid(0, 0); }); +# endif #endif m_process->start(launcherFilePath(), QStringList(m_server->fullServerName())); diff --git a/src/libs/utils/processutils.cpp b/src/libs/utils/processutils.cpp index 62ea514b658..c5fc3d1ade7 100644 --- a/src/libs/utils/processutils.cpp +++ b/src/libs/utils/processutils.cpp @@ -107,7 +107,17 @@ ProcessHelper::ProcessHelper(QObject *parent) : QProcess(parent), m_processStartHandler(this) { #if defined(Q_OS_UNIX) - setChildProcessModifier([this] { + bool needSetsid = m_unixTerminalDisabled; +# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) + if (needSetsid) { + setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession); + needSetsid = false; + } +# endif + + if (!m_lowPriority && !needSetsid) + return; + setChildProcessModifier([=, this] { // nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest if (m_lowPriority) { errno = 0; @@ -116,7 +126,7 @@ ProcessHelper::ProcessHelper(QObject *parent) } // Disable terminal by becoming a session leader. - if (m_unixTerminalDisabled) + if (needSetsid) setsid(); }); #endif