diff --git a/src/libs/utils/launcherpackets.cpp b/src/libs/utils/launcherpackets.cpp index c81f3532bed..e14705509de 100644 --- a/src/libs/utils/launcherpackets.cpp +++ b/src/libs/utils/launcherpackets.cpp @@ -59,13 +59,13 @@ StartProcessPacket::StartProcessPacket(quintptr token) void StartProcessPacket::doSerialize(QDataStream &stream) const { stream << command << arguments << workingDir << env << processMode << writeData << channelMode - << standardInputFile; + << standardInputFile << belowNormalPriority; } void StartProcessPacket::doDeserialize(QDataStream &stream) { stream >> command >> arguments >> workingDir >> env >> processMode >> writeData >> channelMode - >> standardInputFile; + >> standardInputFile >> belowNormalPriority; } diff --git a/src/libs/utils/launcherpackets.h b/src/libs/utils/launcherpackets.h index e7c25d51026..9a70da350d6 100644 --- a/src/libs/utils/launcherpackets.h +++ b/src/libs/utils/launcherpackets.h @@ -115,6 +115,7 @@ public: QByteArray writeData; QProcess::ProcessChannelMode channelMode = QProcess::SeparateChannels; QString standardInputFile; + bool belowNormalPriority = false; private: void doSerialize(QDataStream &stream) const override; diff --git a/src/libs/utils/launchersocket.cpp b/src/libs/utils/launchersocket.cpp index e24a4714e58..4a319d1ee8e 100644 --- a/src/libs/utils/launchersocket.cpp +++ b/src/libs/utils/launchersocket.cpp @@ -409,6 +409,7 @@ void LauncherHandle::doStart() p.writeData = m_writeData; p.channelMode = m_channelMode; p.standardInputFile = m_standardInputFile; + p.belowNormalPriority = m_belowNormalPriority; sendPacket(p); } diff --git a/src/libs/utils/launchersocket.h b/src/libs/utils/launchersocket.h index e82a366b165..28f7b5a35b7 100644 --- a/src/libs/utils/launchersocket.h +++ b/src/libs/utils/launchersocket.h @@ -102,6 +102,9 @@ public: { QMutexLocker locker(&m_mutex); m_environment = environment; } void setWorkingDirectory(const QString &dir) { QMutexLocker locker(&m_mutex); m_workingDirectory = dir; } QProcess::ExitStatus exitStatus() const { QMutexLocker locker(&m_mutex); return m_exitStatus; } + + void setBelowNormalPriority() { m_belowNormalPriority = true; } + signals: void errorOccurred(QProcess::ProcessError error); void started(); @@ -181,6 +184,8 @@ private: CallerHandle *m_callerHandle = nullptr; + bool m_belowNormalPriority = false; + friend class LauncherSocket; friend class CallerHandle; }; diff --git a/src/libs/utils/processutils.cpp b/src/libs/utils/processutils.cpp index 627eb7d36eb..853c4767891 100644 --- a/src/libs/utils/processutils.cpp +++ b/src/libs/utils/processutils.cpp @@ -26,6 +26,13 @@ #include "processutils.h" #include +#ifdef Q_OS_WIN +#ifdef QTCREATOR_PCH_H +#define CALLBACK WINAPI +#endif +#include +#endif + namespace Utils { QIODevice::OpenMode ProcessStartHandler::openMode() const @@ -55,4 +62,16 @@ void ProcessStartHandler::handleProcessStarted(QProcess *process) } } + +void ProcessStartHandler::setBelowNormalPriority(QProcess *process) +{ +#ifdef Q_OS_WIN + process->setCreateProcessArgumentsModifier( + [](QProcess::CreateProcessArguments *args) { + args->flags |= BELOW_NORMAL_PRIORITY_CLASS; + }); +#endif // Q_OS_WIN +} + + } // namespace Utils diff --git a/src/libs/utils/processutils.h b/src/libs/utils/processutils.h index 85c3812be88..9ffef7eca94 100644 --- a/src/libs/utils/processutils.h +++ b/src/libs/utils/processutils.h @@ -46,6 +46,7 @@ public: QIODevice::OpenMode openMode() const; void handleProcessStart(QProcess *process); void handleProcessStarted(QProcess *process); + void setBelowNormalPriority(QProcess *process); private: ProcessMode m_processMode = ProcessMode::Reader; diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index 9c7b12d67fd..390e8e83872 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -136,8 +136,10 @@ public: virtual bool lowPriority() const = 0; virtual void setDisableUnixTerminal() = 0; + void setBelowNormalPriority() { m_belowNormalPriority = true; } + bool isBelowNormalPriority() const { return m_belowNormalPriority; } + #ifdef Q_OS_WIN - virtual void setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier) = 0; virtual void setNativeArguments(const QString &arguments) = 0; #endif @@ -152,6 +154,7 @@ protected: ProcessMode processMode() const { return m_processMode; } private: const ProcessMode m_processMode; + bool m_belowNormalPriority = false; }; class ProcessHelper : public QProcess @@ -218,6 +221,8 @@ public: { m_processStartHandler.setProcessMode(processMode()); m_processStartHandler.setWriteData(writeData); + if (isBelowNormalPriority()) + m_processStartHandler.setBelowNormalPriority(&m_process); m_process.start(program, arguments, m_processStartHandler.openMode()); m_processStartHandler.handleProcessStart(&m_process); } @@ -265,8 +270,6 @@ public: { m_process.m_disableUnixTerminal = true; } #ifdef Q_OS_WIN - void setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier) override - { m_process.setCreateProcessArgumentsModifier(modifier); } void setNativeArguments(const QString &arguments) override { m_process.setNativeArguments(arguments); } #endif @@ -319,7 +322,11 @@ public: { m_handle->setProcessEnvironment(environment); } void setWorkingDirectory(const QString &dir) override { m_handle->setWorkingDirectory(dir); } void start(const QString &program, const QStringList &arguments, const QByteArray &writeData) override - { m_handle->start(program, arguments, writeData); } + { + if (isBelowNormalPriority()) + m_handle->setBelowNormalPriority(); + m_handle->start(program, arguments, writeData); + } void terminate() override { cancel(); } // TODO: what are differences among terminate, kill and close? void kill() override { cancel(); } // TODO: see above void close() override { cancel(); } // TODO: see above @@ -345,8 +352,6 @@ public: void setDisableUnixTerminal() override { QTC_CHECK(false); } #ifdef Q_OS_WIN - void setCreateProcessArgumentsModifier(QProcess::CreateProcessArgumentModifier modifier) override - { QTC_CHECK(false); } void setNativeArguments(const QString &arguments) override { QTC_CHECK(false); } #endif @@ -619,12 +624,7 @@ void QtcProcess::start() command = QCoreApplication::applicationDirPath() + QLatin1String("/qtcreator_ctrlc_stub.exe"); } else if (d->m_process->lowPriority()) { -#ifdef Q_OS_WIN - d->m_process->setCreateProcessArgumentsModifier( - [](QProcess::CreateProcessArguments *args) { - args->flags |= BELOW_NORMAL_PRIORITY_CLASS; - }); -#endif + d->m_process->setBelowNormalPriority(); } ProcessArgs::addArgs(&args, arguments.toWindowsArgs()); #ifdef Q_OS_WIN diff --git a/src/tools/processlauncher/launchersockethandler.cpp b/src/tools/processlauncher/launchersockethandler.cpp index 81a07c2b082..2e0ef6b08e9 100644 --- a/src/tools/processlauncher/launchersockethandler.cpp +++ b/src/tools/processlauncher/launchersockethandler.cpp @@ -243,6 +243,8 @@ void LauncherSocketHandler::handleStartPacket() ProcessStartHandler *handler = process->processStartHandler(); handler->setProcessMode(packet.processMode); handler->setWriteData(packet.writeData); + if (packet.belowNormalPriority) + handler->setBelowNormalPriority(process); process->start(packet.command, packet.arguments, handler->openMode()); handler->handleProcessStart(process); }