forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||
# if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
m_unixTerminalDisabled = true;
|
||||
enableChildProcessModifier();
|
||||
# else
|
||||
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
|
||||
needSetsid = false;
|
||||
}
|
||||
# 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
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user