Skip to content

Commit

Permalink
Fix SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL also applying to HIG…
Browse files Browse the repository at this point in the history
…H priorities

As the name suggests, the hint should only apply to SDL_THREAD_PRIORITY_TIME_CRITICAL

The resulting priorities for my current distro result in these values:

     | High         | Time Critical
Hint |--------------|-----------------
 0   |  P=10 N=-10  | P=5   N=-15
 1   |  P=10 N=-10  | P=-21 N=0
  • Loading branch information
slouken committed Nov 12, 2020
1 parent 5b0d432 commit 0500c04
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 3 deletions.
2 changes: 1 addition & 1 deletion include/SDL_hints.h
Expand Up @@ -801,7 +801,7 @@ extern "C" {
* Currently no other platform hint values are defined but may be in the future.
*
* \note On Linux, the kernel may send SIGKILL to realtime tasks which exceed the distro
* configured execution budget for rtkit. This budget is queriably through RLIMIT_RTTIME
* configured execution budget for rtkit. This budget can be queried through RLIMIT_RTTIME
* after calling SDL_SetThreadPriority().
*/
#define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY"
Expand Down
8 changes: 6 additions & 2 deletions src/thread/pthread/SDL_systhread.c
Expand Up @@ -208,7 +208,7 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
int pri_policy;
pthread_t thread = pthread_self();
const char *policyhint = SDL_GetHint(SDL_HINT_THREAD_PRIORITY_POLICY);
const SDL_bool allow_realtime_hint = SDL_GetHintBoolean(SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL, SDL_FALSE);
const SDL_bool timecritical_realtime_hint = SDL_GetHintBoolean(SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL, SDL_FALSE);

if (pthread_getschedparam(thread, &policy, &sched) != 0) {
return SDL_SetError("pthread_getschedparam() failed");
Expand All @@ -229,14 +229,18 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
pri_policy = SCHED_RR;
break;
#else
pri_policy = allow_realtime_hint ? SCHED_RR : SCHED_OTHER;
pri_policy = SCHED_OTHER;
break;
#endif
default:
pri_policy = policy;
break;
}

if (timecritical_realtime_hint && priority == SDL_THREAD_PRIORITY_TIME_CRITICAL) {
pri_policy = SCHED_RR;
}

if (policyhint) {
if (SDL_strcmp(policyhint, "current") == 0) {
/* Leave current thread scheduler policy unchanged */
Expand Down

0 comments on commit 0500c04

Please sign in to comment.