Added SDL_LinuxSetThreadPriority() to directly set the priority of a Linux thread (tid)

This function tries using RealtimeKit connecting over DBUS as needed.
This commit is contained in:
Sam Lantinga 2018-04-23 19:18:52 -07:00
parent 816a6e68e5
commit 432312561f
4 changed files with 42 additions and 18 deletions

View File

@ -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__

View File

@ -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

View File

@ -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

View File

@ -238,6 +238,31 @@ rtkit_setpriority(pid_t thread, int nice_level)
#endif /* !SDL_USE_LIBDBUS */
#if __LINUX__
int
SDL_LinuxSetThreadPriority(Sint64 threadID, int priority)
{
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!
You can grant the ability to increase thread priority by
running the following command on your application binary:
sudo setcap 'cap_sys_nice=eip' <application>
Let's try setting priority with RealtimeKit...
README and sample code at:
http://git.0pointer.net/rtkit.git
*/
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)
{
@ -255,24 +280,7 @@ SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
} else {
value = 0;
}
if (setpriority(PRIO_PROCESS, thread, value) < 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!
You can grant the ability to increase thread priority by
running the following command on your application binary:
sudo setcap 'cap_sys_nice=eip' <application>
Let's try setting priority with RealtimeKit...
README and sample code at:
http://git.0pointer.net/rtkit.git
*/
if (rtkit_setpriority(thread, value) == SDL_FALSE) {
return SDL_SetError("setpriority() failed");
}
}
return 0;
return SDL_LinuxSetThreadPriority(thread, value);
#else
struct sched_param sched;
int policy;