From 48c6087faf8e6ba736c9640fc87ecd583bfba4e8 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 7 Dec 2021 20:07:51 +0000 Subject: [PATCH] Thread: Update macOS thread priority calculation The Apple threading documentation [^1] says the following: > The second argument to pthread_setschedparam is the desired policy, which can currently be one of SCHED_FIFO (first in, first out), SCHED_RR (round-robin), or SCHED_OTHER. The SCHED_OTHER policy is generally used for extra policies that are specific to a given operating system, and should thus be avoided when writing portable code. This appears to differ from the policy semantics on Linux and BSD, where FIFO and RR are both explicitly real-time policies. Therefore, on Linux/BSD we only enable the RR policy if the requested priority is 8 or higher. Meanwhile, on macOS, we map all thread priorities (0 - 10) onto the RR policy with an appropriate priority. [^1]: https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/scheduler/scheduler.html --- modules/juce_core/native/juce_posix_SharedCode.h | 11 ++++++++--- modules/juce_opengl/opengl/juce_OpenGLContext.cpp | 1 - 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index f77928898e..dbf06043a1 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -960,7 +960,12 @@ void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) bool Thread::setThreadPriority (void* handle, int priority) { constexpr auto maxInputPriority = 10; - constexpr auto lowestRealtimePriority = 8; + + #if JUCE_LINUX || JUCE_BSD + constexpr auto lowestRrPriority = 8; + #else + constexpr auto lowestRrPriority = 0; + #endif struct sched_param param; int policy; @@ -971,7 +976,7 @@ bool Thread::setThreadPriority (void* handle, int priority) if (pthread_getschedparam ((pthread_t) handle, &policy, ¶m) != 0) return false; - policy = priority < lowestRealtimePriority ? SCHED_OTHER : SCHED_RR; + policy = priority < lowestRrPriority ? SCHED_OTHER : SCHED_RR; const auto minPriority = sched_get_priority_min (policy); const auto maxPriority = sched_get_priority_max (policy); @@ -981,7 +986,7 @@ bool Thread::setThreadPriority (void* handle, int priority) if (policy == SCHED_OTHER) return 0; - return jmap (priority, lowestRealtimePriority, maxInputPriority, minPriority, maxPriority); + return jmap (priority, lowestRrPriority, maxInputPriority, minPriority, maxPriority); }(); return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp index d4129a0abc..c20358f6ab 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp @@ -118,7 +118,6 @@ public: if (nativeContext != nullptr) { renderThread = std::make_unique (1); - renderThread->setThreadPriorities (9); resume(); } }