From 0713c5790d9edc16dd48717e8f98c70bbc0bd793 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 26 May 2020 13:19:44 -0700 Subject: [PATCH] More Linux fixes. --- src/core/linux/SDL_threadprio.c | 72 +++++++++++++++--------------- src/thread/pthread/SDL_systhread.c | 6 ++- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/src/core/linux/SDL_threadprio.c b/src/core/linux/SDL_threadprio.c index 7141888e7..30a3748a2 100644 --- a/src/core/linux/SDL_threadprio.c +++ b/src/core/linux/SDL_threadprio.c @@ -223,53 +223,53 @@ SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedP #if SDL_THREADS_DISABLED return SDL_Unsupported(); #else - if (schedPolicy != SCHED_RR && schedPolicy != SCHED_FIFO && setpriority(PRIO_PROCESS, (id_t)threadID, priority) == 0) { - return 0; + int osPriority; + + if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) { + if (sdlPriority == SDL_THREAD_PRIORITY_LOW) { + osPriority = 1; + } else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) { + osPriority = rtkit_max_realtime_priority * 3 / 4; + } else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) { + osPriority = rtkit_max_realtime_priority; + } else { + osPriority = rtkit_max_realtime_priority / 2; + } + } else { + if (sdlPriority == SDL_THREAD_PRIORITY_LOW) { + osPriority = 19; + } else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) { + osPriority = -10; + } else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) { + osPriority = -20; + } else { + osPriority = 0; + } + + if (setpriority(PRIO_PROCESS, (id_t)threadID, osPriority) == 0) { + return 0; + } } #if SDL_USE_LIBDBUS /* Note that this fails you most likely: - * Have your process's scheduler incorrectly configured. - See the requirements at: - http://git.0pointer.net/rtkit.git/tree/README#n16 - * Encountered dbus/polkit security restrictions. Note - that the RealtimeKit1 dbus endpoint is inaccessible - over ssh connections for most common distro configs. - You might want to check your local config for details: - /usr/share/polkit-1/actions/org.freedesktop.RealtimeKit1.policy + * Have your process's scheduler incorrectly configured. + See the requirements at: + http://git.0pointer.net/rtkit.git/tree/README#n16 + * Encountered dbus/polkit security restrictions. Note + that the RealtimeKit1 dbus endpoint is inaccessible + over ssh connections for most common distro configs. + You might want to check your local config for details: + /usr/share/polkit-1/actions/org.freedesktop.RealtimeKit1.policy README and sample code at: http://git.0pointer.net/rtkit.git */ if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) { - int rtPriority; - - if (sdlPriority == SDL_THREAD_PRIORITY_LOW) { - rtPriority = 1; - } else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) { - rtPriority = rtkit_max_realtime_priority * 3 / 4; - } else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) { - rtPriority = rtkit_max_realtime_priority; - } else { - rtPriority = rtkit_max_realtime_priority / 2; - } - - if (rtkit_setpriority_realtime((pid_t)threadID, rtPriority)) { + if (rtkit_setpriority_realtime((pid_t)threadID, osPriority)) { return 0; } } else { - int niceLevel; - - if (sdlPriority == SDL_THREAD_PRIORITY_LOW) { - niceLevel = 19; - } else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) { - niceLevel = -10; - } else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) { - niceLevel = -20; - } else { - niceLevel = 0; - } - - if (rtkit_setpriority_nice((pid_t)threadID, niceLevel)) { + if (rtkit_setpriority_nice((pid_t)threadID, osPriority)) { return 0; } } diff --git a/src/thread/pthread/SDL_systhread.c b/src/thread/pthread/SDL_systhread.c index d2f204365..6df049c78 100644 --- a/src/thread/pthread/SDL_systhread.c +++ b/src/thread/pthread/SDL_systhread.c @@ -247,8 +247,10 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority) } #if __LINUX__ - pid_t linuxTid = syscall(SYS_gettid); - return SDL_LinuxSetThreadPriorityAndPolicy(linuxTid, priority, policy); + { + pid_t linuxTid = syscall(SYS_gettid); + return SDL_LinuxSetThreadPriorityAndPolicy(linuxTid, priority, policy); + } #else if (priority == SDL_THREAD_PRIORITY_LOW) { sched.sched_priority = sched_get_priority_min(policy);