mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-09-29 06:28:29 +00:00
Fix process randomly getting killed when SDL_THREAD_PRIORITY_HIGH/TIME_CRITICAL is set
When we request realtime priority from rtkit, we have a rttime limit. If we exceed that limit, the kernel will send SIGKILL to the process to terminate it. This isn't something that most high priority processes will want, only processes that selectively opt into SCHED_RR/FIFO through SDL_HINT_THREAD_PRIORITY_POLICY should be subject to this level of scrutiny. This change: * Switches non-apple posix OSs to use SCHED_OTHER instead of SCHED_RR for SDL_THREAD_PRIORITY_HIGH/SDL_THREAD_PRIORITY_TIME_CRITICAL. * Fixes using a hardcoded RLIMIT_RTTIME, instead queries it from rtkit * Only sets RLIMIT_RTTIME for MakeRealtime rtkit requests * Adds a note regarding the possible SIGKILL with SDL_HINT_THREAD_PRIORITY_POLICY * Introduces SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL to allow apps to acquire realtime scheduling policies on Linux
This commit is contained in:
@@ -208,6 +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);
|
||||
|
||||
if (pthread_getschedparam(thread, &policy, &sched) != 0) {
|
||||
return SDL_SetError("pthread_getschedparam() failed");
|
||||
@@ -223,8 +224,14 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||
break;
|
||||
case SDL_THREAD_PRIORITY_HIGH:
|
||||
case SDL_THREAD_PRIORITY_TIME_CRITICAL:
|
||||
#if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__TVOS__)
|
||||
/* Apple requires SCHED_RR for high priority threads */
|
||||
pri_policy = SCHED_RR;
|
||||
break;
|
||||
#else
|
||||
pri_policy = allow_realtime_hint ? SCHED_RR : SCHED_OTHER;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
pri_policy = policy;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user