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)
|
ProcessHelper::ProcessHelper(QObject *parent)
|
||||||
: QProcess(parent), m_processStartHandler(this)
|
: QProcess(parent), m_processStartHandler(this)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void ProcessHelper::setLowPriority()
|
||||||
|
{
|
||||||
|
m_lowPriority = true;
|
||||||
|
enableChildProcessModifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcessHelper::setUnixTerminalDisabled()
|
||||||
{
|
{
|
||||||
#if defined(Q_OS_UNIX)
|
#if defined(Q_OS_UNIX)
|
||||||
bool needSetsid = m_unixTerminalDisabled;
|
# if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||||
# if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
m_unixTerminalDisabled = true;
|
||||||
if (needSetsid) {
|
enableChildProcessModifier();
|
||||||
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
|
# else
|
||||||
needSetsid = false;
|
setUnixProcessParameters(QProcess::UnixProcessFlag::CreateNewSession);
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (!m_lowPriority && !needSetsid)
|
void ProcessHelper::setUseCtrlCStub(bool enabled)
|
||||||
return;
|
{
|
||||||
setChildProcessModifier([=, this] {
|
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
|
// nice value range is -20 to +19 where -20 is highest, 0 default and +19 is lowest
|
||||||
if (m_lowPriority) {
|
if (m_lowPriority) {
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@@ -125,18 +141,15 @@ ProcessHelper::ProcessHelper(QObject *parent)
|
|||||||
perror("Failed to set nice value");
|
perror("Failed to set nice value");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||||
// Disable terminal by becoming a session leader.
|
// Disable terminal by becoming a session leader.
|
||||||
if (needSetsid)
|
if (m_unixTerminalDisabled)
|
||||||
setsid();
|
setsid();
|
||||||
|
# endif
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessHelper::setUseCtrlCStub(bool enabled)
|
|
||||||
{
|
|
||||||
m_useCtrlCStub = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProcessHelper::terminateProcess()
|
void ProcessHelper::terminateProcess()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
@@ -40,8 +40,8 @@ public:
|
|||||||
|
|
||||||
using QProcess::setErrorString;
|
using QProcess::setErrorString;
|
||||||
|
|
||||||
void setLowPriority() { m_lowPriority = true; }
|
void setLowPriority();
|
||||||
void setUnixTerminalDisabled() { m_unixTerminalDisabled = true; }
|
void setUnixTerminalDisabled();
|
||||||
void setUseCtrlCStub(bool enabled); // release only
|
void setUseCtrlCStub(bool enabled); // release only
|
||||||
|
|
||||||
static void terminateProcess(QProcess *process);
|
static void terminateProcess(QProcess *process);
|
||||||
@@ -49,6 +49,7 @@ public:
|
|||||||
static void interruptPid(qint64 pid);
|
static void interruptPid(qint64 pid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void enableChildProcessModifier();
|
||||||
void terminateProcess();
|
void terminateProcess();
|
||||||
|
|
||||||
bool m_lowPriority = false;
|
bool m_lowPriority = false;
|
||||||
|
Reference in New Issue
Block a user