21 #include "../../SDL_internal.h"
29 #if !SDL_THREADS_DISABLED
31 #include <sys/resource.h>
37 #define RLIMIT_RTTIME 15
40 #ifndef SCHED_RESET_ON_FORK
41 #define SCHED_RESET_ON_FORK 0x40000000
50 #define RTKIT_DBUS_NODE "org.freedesktop.RealtimeKit1"
51 #define RTKIT_DBUS_PATH "/org/freedesktop/RealtimeKit1"
52 #define RTKIT_DBUS_INTERFACE "org.freedesktop.RealtimeKit1"
54 static pthread_once_t rtkit_initialize_once = PTHREAD_ONCE_INIT;
55 static Sint32 rtkit_min_nice_level = -20;
56 static Sint32 rtkit_max_realtime_priority = 99;
57 static Sint64 rtkit_max_rttime_usec = 200000;
62 SDL_DBusContext *dbus = SDL_DBus_GetContext();
65 if (!dbus || !SDL_DBus_QueryPropertyOnConnection(dbus->system_conn, RTKIT_DBUS_NODE, RTKIT_DBUS_PATH, RTKIT_DBUS_INTERFACE,
"MinNiceLevel",
66 DBUS_TYPE_INT32, &rtkit_min_nice_level)) {
67 rtkit_min_nice_level = -20;
71 if (!dbus || !SDL_DBus_QueryPropertyOnConnection(dbus->system_conn, RTKIT_DBUS_NODE, RTKIT_DBUS_PATH, RTKIT_DBUS_INTERFACE,
"MaxRealtimePriority",
72 DBUS_TYPE_INT32, &rtkit_max_realtime_priority)) {
73 rtkit_max_realtime_priority = 99;
77 if (!dbus || !SDL_DBus_QueryPropertyOnConnection(dbus->system_conn, RTKIT_DBUS_NODE, RTKIT_DBUS_PATH, RTKIT_DBUS_INTERFACE,
"RTTimeUSecMax",
78 DBUS_TYPE_INT64, &rtkit_max_rttime_usec)) {
79 rtkit_max_rttime_usec = 200000;
84 rtkit_initialize_realtime_thread()
107 struct rlimit rlimit;
108 int nLimit = RLIMIT_RTTIME;
110 int nSchedPolicy = sched_getscheduler(nPid) | SCHED_RESET_ON_FORK;
111 struct sched_param schedParam = {};
114 err = getrlimit(nLimit, &rlimit);
121 rlimit.rlim_max = rtkit_max_rttime_usec;
122 rlimit.rlim_cur = rlimit.rlim_max / 2;
123 err = setrlimit(nLimit, &rlimit);
130 err = sched_getparam(nPid, &schedParam);
136 err = sched_setscheduler(nPid, nSchedPolicy, &schedParam);
146 rtkit_setpriority_nice(pid_t thread,
int nice_level)
150 SDL_DBusContext *dbus = SDL_DBus_GetContext();
152 pthread_once(&rtkit_initialize_once, rtkit_initialize);
154 if (si32 < rtkit_min_nice_level)
155 si32 = rtkit_min_nice_level;
157 if (!dbus || !SDL_DBus_CallMethodOnConnection(dbus->system_conn,
158 RTKIT_DBUS_NODE, RTKIT_DBUS_PATH, RTKIT_DBUS_INTERFACE,
"MakeThreadHighPriority",
159 DBUS_TYPE_UINT64, &ui64, DBUS_TYPE_INT32, &si32, DBUS_TYPE_INVALID,
160 DBUS_TYPE_INVALID)) {
167 rtkit_setpriority_realtime(pid_t thread,
int rt_priority)
171 SDL_DBusContext *dbus = SDL_DBus_GetContext();
173 pthread_once(&rtkit_initialize_once, rtkit_initialize);
175 if (ui32 > rtkit_max_realtime_priority)
176 ui32 = rtkit_max_realtime_priority;
184 rtkit_initialize_realtime_thread();
186 if (!dbus || !SDL_DBus_CallMethodOnConnection(dbus->system_conn,
187 RTKIT_DBUS_NODE, RTKIT_DBUS_PATH, RTKIT_DBUS_INTERFACE,
"MakeThreadRealtime",
188 DBUS_TYPE_UINT64, &ui64, DBUS_TYPE_UINT32, &ui32, DBUS_TYPE_INVALID,
189 DBUS_TYPE_INVALID)) {
196 #define rtkit_max_realtime_priority 99
205 #if SDL_THREADS_DISABLED
208 if (setpriority(PRIO_PROCESS, (id_t)threadID, priority) == 0) {
225 if (rtkit_setpriority_nice((pid_t)threadID, priority)) {
236 SDL_LinuxSetThreadPriorityAndPolicy(
Sint64 threadID,
int sdlPriority,
int schedPolicy)
238 #if SDL_THREADS_DISABLED
243 if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) {
247 osPriority = rtkit_max_realtime_priority * 3 / 4;
249 osPriority = rtkit_max_realtime_priority;
251 osPriority = rtkit_max_realtime_priority / 2;
264 if (setpriority(PRIO_PROCESS, (id_t)threadID, osPriority) == 0) {
282 if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) {
283 if (rtkit_setpriority_realtime((pid_t)threadID, osPriority)) {
287 if (rtkit_setpriority_nice((pid_t)threadID, osPriority)) {
#define SDL_LinuxSetThreadPriority
#define SDL_Unsupported()
@ SDL_THREAD_PRIORITY_TIME_CRITICAL
@ SDL_THREAD_PRIORITY_LOW
@ SDL_THREAD_PRIORITY_HIGH