X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9e84b84742248ef54a561b4937bbc039332c2c51..57530dba8561c3133657ea946665b2d6a56279b8:/src/unix/threadpsx.cpp diff --git a/src/unix/threadpsx.cpp b/src/unix/threadpsx.cpp index 36d6ee7d0e..47e9a41e62 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 // ---------------------------------------------------------------------------- @@ -207,7 +210,7 @@ wxMutexInternal::wxMutexInternal(wxMutexType mutexType) m_isOk = err == 0; if ( !m_isOk ) { - wxLogApiError("pthread_mutex_init()", err); + wxLogApiError( wxT("pthread_mutex_init()"), err); } } @@ -218,7 +221,7 @@ wxMutexInternal::~wxMutexInternal() int err = pthread_mutex_destroy(&m_mutex); if ( err != 0 ) { - wxLogApiError("pthread_mutex_destroy()", err); + wxLogApiError( wxT("pthread_mutex_destroy()"), err); } } } @@ -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;