From 7bfe6a32e0be5a4e4b349d25ccaf87a1ed9ab127 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Thu, 4 Jul 2002 09:04:17 +0000 Subject: [PATCH] Applied patch from Mark Armstrong Allows you to set a thread priority under Linux. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/unix/threadpsx.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 36d6ee7d0e..d87748e03f 100644 --- a/src/unix/threadpsx.cpp +++ b/src/unix/threadpsx.cpp @@ -53,6 +53,9 @@ // we use wxFFile under Linux in GetCPUCount() #ifdef __LINUX__ #include "wx/ffile.h" + // For setpriority. + #include + #include #endif // ---------------------------------------------------------------------------- @@ -1172,6 +1175,45 @@ void wxThread::SetPriority(unsigned int prio) case STATE_RUNNING: case STATE_PAUSED: #ifdef HAVE_THREAD_PRIORITY_FUNCTIONS +#if defined(__LINUX__) +// On Linux, pthread_setschedparam with SCHED_OTHER does not allow +// a priority other than 0. Instead, we use the BSD setpriority +// which alllows us to set a 'nice' value between 20 to -20. Only +// super user can set a value less than zero (more negative yields +// higher priority). setpriority set the static priority of a process, +// but this is OK since Linux is configured as a thread per process. + { + float fPrio; + float pSpan; + int iPrio; + + // Map Wx priorites (WXTHREAD_MIN_PRIORITY - + // WXTHREAD_MAX_PRIORITY) into BSD priorities (20 - -20). + // Do calculation of values instead of hard coding them + // to make maintenance easier. + + pSpan = ((float)(WXTHREAD_MAX_PRIORITY - WXTHREAD_MIN_PRIORITY)) / 2.0; + + // prio starts as ................... // value => (0) >= p <= (n) + + fPrio = ((float)prio) - pSpan; // value => (-n) >= p <= (+n) + + fPrio = 0.0 - fPrio; // value => (+n) <= p >= (-n) + + fPrio = fPrio * (20. / pSpan) + .5; // value => (20) <= p >= (-20) + + iPrio = (int)fPrio; + + // Clamp prio from 20 - -20; + iPrio = (iPrio > 20) ? 20 : iPrio; + iPrio = (iPrio < -20) ? -20 : iPrio; + + if (setpriority(PRIO_PROCESS, 0, iPrio) == -1) + { + wxLogError(_("Failed to set thread priority %d."), prio); + } + } +#else // __LINUX__ { struct sched_param sparam; sparam.sched_priority = prio; @@ -1182,6 +1224,7 @@ void wxThread::SetPriority(unsigned int prio) wxLogError(_("Failed to set thread priority %d."), prio); } } +#endif // __LINUX__ #endif // HAVE_THREAD_PRIORITY_FUNCTIONS break; -- 2.45.2