Added SDL_LinuxSetThreadPriority() to directly set the priority of a Linux thread (tid) This function tries using RealtimeKit connecting over DBUS as needed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
diff --git a/include/SDL_system.h b/include/SDL_system.h
index 7b776fd..77186b5 100644
--- a/include/SDL_system.h
+++ b/include/SDL_system.h
@@ -76,6 +76,18 @@ extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *a
#endif /* __WIN32__ */
+/* Platform specific functions for Linux */
+#ifdef __LINUX__
+
+/**
+ \brief Sets the UNIX nice value for a thread, using setpriority() if possible, and RealtimeKit if available.
+
+ \return 0 on success, or -1 on error.
+ */
+extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriority(Sint64 threadID, int priority);
+
+#endif /* __LINUX__ */
+
/* Platform specific functions for iOS */
#if defined(__IPHONEOS__) && __IPHONEOS__
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index 77a73e5..b454e5a 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -670,3 +670,4 @@
#define SDL_log10 SDL_log10_REAL
#define SDL_log10f SDL_log10f_REAL
#define SDL_GameControllerMappingForDeviceIndex SDL_GameControllerMappingForDeviceIndex_REAL
+#define SDL_LinuxSetThreadPriority SDL_LinuxSetThreadPriority_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index 1b57a2a..e4e6907 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -708,3 +708,6 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_IsAndroidTV,(void),(),return)
SDL_DYNAPI_PROC(double,SDL_log10,(double a),(a),return)
SDL_DYNAPI_PROC(float,SDL_log10f,(float a),(a),return)
SDL_DYNAPI_PROC(char*,SDL_GameControllerMappingForDeviceIndex,(int a),(a),return)
+#ifdef __LINUX__
+SDL_DYNAPI_PROC(int,SDL_LinuxSetThreadPriority,(Sint64 a, int b),(a,b),return)
+#endif
diff --git a/src/thread/pthread/SDL_systhread.c b/src/thread/pthread/SDL_systhread.c
index 3abb4da..8e48368 100644
--- a/src/thread/pthread/SDL_systhread.c
+++ b/src/thread/pthread/SDL_systhread.c
@@ -238,24 +238,11 @@ rtkit_setpriority(pid_t thread, int nice_level)
#endif /* !SDL_USE_LIBDBUS */
+#if __LINUX__
int
-SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
+SDL_LinuxSetThreadPriority(Sint64 threadID, int priority)
{
-#if __NACL__
- /* FIXME: Setting thread priority does not seem to be supported in NACL */
- return 0;
-#elif __LINUX__
- int value;
- pid_t thread = syscall(SYS_gettid);
-
- if (priority == SDL_THREAD_PRIORITY_LOW) {
- value = 19;
- } else if (priority == SDL_THREAD_PRIORITY_HIGH) {
- value = -20;
- } else {
- value = 0;
- }
- if (setpriority(PRIO_PROCESS, thread, value) < 0) {
+ if (setpriority(PRIO_PROCESS, (id_t)threadID, priority) < 0) {
/* Note that this fails if you're trying to set high priority
and you don't have root permission. BUT DON'T RUN AS ROOT!
@@ -268,11 +255,32 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
README and sample code at:
http://git.0pointer.net/rtkit.git
*/
- if (rtkit_setpriority(thread, value) == SDL_FALSE) {
+ if (rtkit_setpriority((pid_t)threadID, priority) == SDL_FALSE) {
return SDL_SetError("setpriority() failed");
}
}
return 0;
+}
+#endif /* __LINUX__ */
+
+int
+SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
+{
+#if __NACL__
+ /* FIXME: Setting thread priority does not seem to be supported in NACL */
+ return 0;
+#elif __LINUX__
+ int value;
+ pid_t thread = syscall(SYS_gettid);
+
+ if (priority == SDL_THREAD_PRIORITY_LOW) {
+ value = 19;
+ } else if (priority == SDL_THREAD_PRIORITY_HIGH) {
+ value = -20;
+ } else {
+ value = 0;
+ }
+ return SDL_LinuxSetThreadPriority(thread, value);
#else
struct sched_param sched;
int policy;