Skip to content

Commit

Permalink
Added SDL_LinuxSetThreadPriority() to directly set the priority of a …
Browse files Browse the repository at this point in the history
…Linux thread (tid)

This function tries using RealtimeKit connecting over DBUS as needed.
  • Loading branch information
slouken committed Apr 24, 2018
1 parent 816a6e6 commit 4323125
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 17 deletions.
12 changes: 12 additions & 0 deletions include/SDL_system.h
Expand Up @@ -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__

Expand Down
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_overrides.h
Expand Up @@ -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
3 changes: 3 additions & 0 deletions src/dynapi/SDL_dynapi_procs.h
Expand Up @@ -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
42 changes: 25 additions & 17 deletions src/thread/pthread/SDL_systhread.c
Expand Up @@ -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!
Expand All @@ -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;
Expand Down

0 comments on commit 4323125

Please sign in to comment.