diff options
author | Martin Zielinski <martin.zielinski@nokia.com> | 2012-04-10 13:37:04 +0200 |
---|---|---|
committer | Chris Craig <ext-chris.craig@nokia.com> | 2012-04-11 16:21:18 +0200 |
commit | 78d09d5807985ab231b3f1224e2c262c50d9112c (patch) | |
tree | 6ceadb82b4d9111f4b07088b2c93699884db9a3d | |
parent | dde384243669a4225258112000f16aa9a87fbac5 (diff) |
Priority changes are applied to childprocesses as well
Changes to the priority of a unixprocess does apply the priority
also to all childprocesses and threads.
Change-Id: Iaff1a5f7ef0742268d527e6b6800bbd47c39146c
Reviewed-by: Lasse Holmstedt <lasse.holmstedt@nokia.com>
Reviewed-by: Chris Craig <ext-chris.craig@nokia.com>
-rw-r--r-- | src/core/procutils.cpp | 18 | ||||
-rw-r--r-- | src/core/procutils.h | 1 | ||||
-rw-r--r-- | src/core/unixprocessbackend.cpp | 20 |
3 files changed, 26 insertions, 13 deletions
diff --git a/src/core/procutils.cpp b/src/core/procutils.cpp index 8c98d56..7ecfd28 100644 --- a/src/core/procutils.cpp +++ b/src/core/procutils.cpp @@ -45,6 +45,7 @@ #include <sys/socket.h> #include <sys/resource.h> #include <signal.h> +#include <errno.h> #include <QFile> #include <QFileInfo> @@ -55,7 +56,6 @@ #include <QRegExp> #elif defined(Q_OS_MAC) #include <sys/sysctl.h> -#include <errno.h> #endif @@ -409,6 +409,22 @@ void ProcUtils::sendSignalToProcess(pid_t pid, int sig) ::kill(pid, sig); } +/*! + Set a process or process group priority + */ + +void ProcUtils::setPriority(pid_t pid, qint32 priority) +{ + pid_t pgrp = ::getpgid(pid); + if (pgrp != -1 && pgrp != ::getpgrp()) { + if (::setpriority(PRIO_PGRP, pgrp, priority) == 0) + return; + qErrnoWarning(errno, "Failed to set process group %d priority to %d", pgrp, priority); + } + if (::setpriority(PRIO_PROCESS, pid, priority)) + qErrnoWarning(errno, "Failed to set process %d priority to %d", pid, priority); +} + #include "moc_procutils.cpp" QT_END_NAMESPACE_PROCESSMANAGER diff --git a/src/core/procutils.h b/src/core/procutils.h index 3119d08..68008e7 100644 --- a/src/core/procutils.h +++ b/src/core/procutils.h @@ -111,6 +111,7 @@ public: static bool setOomAdjustment(pid_t pid, qint32 oomAdjustment); static void sendSignalToProcess(pid_t pid, int sig); + static void setPriority(pid_t pid, qint32 priority); }; QT_END_NAMESPACE_PROCESSMANAGER diff --git a/src/core/unixprocessbackend.cpp b/src/core/unixprocessbackend.cpp index 76bd063..18e8123 100644 --- a/src/core/unixprocessbackend.cpp +++ b/src/core/unixprocessbackend.cpp @@ -44,7 +44,6 @@ #include <errno.h> #include <signal.h> #include <QDebug> -#include <QFile> QT_BEGIN_NAMESPACE_PROCESSMANAGER @@ -101,18 +100,16 @@ qint32 UnixProcessBackend::actualPriority() const } /*! - Set the process priority to \a priority + Set the process priority to \a priority. If the process + is in its own process group, we fix the process priority + of the entire group. */ void UnixProcessBackend::setDesiredPriority(qint32 priority) { ProcessBackend::setDesiredPriority(priority); - if (m_process) { - // ### Is this always correct? Could we have an m_process without a pid? - if (setpriority(PRIO_PROCESS, m_process->pid(), priority)) - qWarning() << "Failed to set process priority from " << actualPriority() << - "to" << priority << " : errno = " << errno; - } + if (m_process) + ProcUtils::setPriority(m_process->pid(), priority); } #if defined(Q_OS_LINUX) @@ -249,10 +246,9 @@ qint64 UnixProcessBackend::write(const char *data, qint64 maxSize) */ void UnixProcessBackend::handleProcessStarted() { - if (m_info.contains(ProcessInfoConstants::Priority) && - setpriority(PRIO_PROCESS, m_process->pid(), m_info.priority())) - qWarning() << "Failed to set process priority at startup from " << actualPriority() << - "to" << m_info.priority() << " : errno = " << errno; + if (m_info.contains(ProcessInfoConstants::Priority)) + ProcUtils::setPriority(m_process->pid(), m_info.priority()); + if (m_info.contains(ProcessInfoConstants::OomAdjustment) && !ProcUtils::setOomAdjustment(m_process->pid(), m_info.oomAdjustment())) qWarning() << "Failed to set process oom score at startup from " << actualOomAdjustment() << |