summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Zielinski <martin.zielinski@nokia.com>2012-04-10 13:37:04 +0200
committerChris Craig <ext-chris.craig@nokia.com>2012-04-11 16:21:18 +0200
commit78d09d5807985ab231b3f1224e2c262c50d9112c (patch)
tree6ceadb82b4d9111f4b07088b2c93699884db9a3d
parentdde384243669a4225258112000f16aa9a87fbac5 (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.cpp18
-rw-r--r--src/core/procutils.h1
-rw-r--r--src/core/unixprocessbackend.cpp20
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() <<