mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-04-03 22:29:19 +00:00
Most SDL functions used to indicate success or failure using an int return code. These functions have been changed to return SDL_bool. Here is a coccinelle patch to change code that previously compared the return value to 0 and changes it to a boolean test: @ bool_return_type @ identifier func =~ "^(SDL_AddEventWatch|SDL_AddHintCallback|SDL_AddSurfaceAlternateImage|SDL_AddVulkanRenderSemaphores|SDL_BindAudioStream|SDL_BindAudioStreams|SDL_BlitSurface|SDL_BlitSurface9Grid|SDL_BlitSurfaceScaled|SDL_BlitSurfaceTiled|SDL_BlitSurfaceTiledWithScale|SDL_BlitSurfaceUnchecked|SDL_BlitSurfaceUncheckedScaled|SDL_CaptureMouse|SDL_ClearAudioStream|SDL_ClearClipboardData|SDL_ClearComposition|SDL_ClearError|SDL_ClearProperty|SDL_ClearSurface|SDL_CloseIO|SDL_CloseStorage|SDL_ConvertAudioSamples|SDL_ConvertEventToRenderCoordinates|SDL_ConvertPixels|SDL_ConvertPixelsAndColorspace|SDL_CopyFile|SDL_CopyProperties|SDL_CopyStorageFile|SDL_CreateDirectory|SDL_CreateStorageDirectory|SDL_CreateWindowAndRenderer|SDL_DateTimeToTime|SDL_DestroyWindowSurface|SDL_DetachVirtualJoystick|SDL_DisableScreenSaver|SDL_EnableScreenSaver|SDL_EnumerateDirectory|SDL_EnumerateProperties|SDL_EnumerateStorageDirectory|SDL_FillSurfaceRect|SDL_FillSurfaceRects|SDL_FlashWindow|SDL_FlipSurface|SDL_FlushAudioStream|SDL_FlushRenderer|SDL_GL_DestroyContext|SDL_GL_GetAttribute|SDL_GL_GetSwapInterval|SDL_GL_LoadLibrary|SDL_GL_MakeCurrent|SDL_GL_SetAttribute|SDL_GL_SetSwapInterval|SDL_GL_SwapWindow|SDL_GetAudioDeviceFormat|SDL_GetAudioStreamFormat|SDL_GetCameraFormat|SDL_GetClosestFullscreenDisplayMode|SDL_GetCurrentRenderOutputSize|SDL_GetCurrentTime|SDL_GetDXGIOutputInfo|SDL_GetDateTimeLocalePreferences|SDL_GetDisplayBounds|SDL_GetDisplayUsableBounds|SDL_GetGDKDefaultUser|SDL_GetGDKTaskQueue|SDL_GetGamepadSensorData|SDL_GetGamepadTouchpadFinger|SDL_GetHapticEffectStatus|SDL_GetJoystickBall|SDL_GetMasksForPixelFormat|SDL_GetPathInfo|SDL_GetRectUnion|SDL_GetRectUnionFloat|SDL_GetRenderClipRect|SDL_GetRenderColorScale|SDL_GetRenderDrawBlendMode|SDL_GetRenderDrawColor|SDL_GetRenderDrawColorFloat|SDL_GetRenderLogicalPresentation|SDL_GetRenderLogicalPresentationRect|SDL_GetRenderOutputSize|SDL_GetRenderSafeArea|SDL_GetRenderScale|SDL_GetRenderVSync|SDL_GetRenderViewport|SDL_GetSensorData|SDL_GetStorageFileSize|SDL_GetStoragePathInfo|SDL_GetSurfaceAlphaMod|SDL_GetSurfaceBlendMode|SDL_GetSurfaceClipRect|SDL_GetSurfaceColorKey|SDL_GetSurfaceColorMod|SDL_GetTextInputArea|SDL_GetTextureAlphaMod|SDL_GetTextureAlphaModFloat|SDL_GetTextureBlendMode|SDL_GetTextureColorMod|SDL_GetTextureColorModFloat|SDL_GetTextureScaleMode|SDL_GetTextureSize|SDL_GetWindowAspectRatio|SDL_GetWindowBordersSize|SDL_GetWindowMaximumSize|SDL_GetWindowMinimumSize|SDL_GetWindowPosition|SDL_GetWindowRelativeMouseMode|SDL_GetWindowSafeArea|SDL_GetWindowSize|SDL_GetWindowSizeInPixels|SDL_GetWindowSurfaceVSync|SDL_HideCursor|SDL_HideWindow|SDL_Init|SDL_InitHapticRumble|SDL_InitSubSystem|SDL_LoadWAV|SDL_LoadWAV_IO|SDL_LockAudioStream|SDL_LockProperties|SDL_LockSurface|SDL_LockTexture|SDL_LockTextureToSurface|SDL_MaximizeWindow|SDL_MinimizeWindow|SDL_MixAudio|SDL_OpenURL|SDL_OutOfMemory|SDL_PauseAudioDevice|SDL_PauseAudioStreamDevice|SDL_PauseHaptic|SDL_PlayHapticRumble|SDL_PremultiplyAlpha|SDL_PremultiplySurfaceAlpha|SDL_PushEvent|SDL_PutAudioStreamData|SDL_RaiseWindow|SDL_ReadStorageFile|SDL_ReadSurfacePixel|SDL_ReadSurfacePixelFloat|SDL_RegisterApp|SDL_ReloadGamepadMappings|SDL_RemovePath|SDL_RemoveStoragePath|SDL_RemoveTimer|SDL_RenamePath|SDL_RenameStoragePath|SDL_RenderClear|SDL_RenderCoordinatesFromWindow|SDL_RenderCoordinatesToWindow|SDL_RenderFillRect|SDL_RenderFillRects|SDL_RenderGeometry|SDL_RenderGeometryRaw|SDL_RenderLine|SDL_RenderLines|SDL_RenderPoint|SDL_RenderPoints|SDL_RenderPresent|SDL_RenderRect|SDL_RenderRects|SDL_RenderTexture|SDL_RenderTexture9Grid|SDL_RenderTextureRotated|SDL_RenderTextureTiled|SDL_RequestAndroidPermission|SDL_RestoreWindow|SDL_ResumeAudioDevice|SDL_ResumeAudioStreamDevice|SDL_ResumeHaptic|SDL_RumbleGamepad|SDL_RumbleGamepadTriggers|SDL_RumbleJoystick|SDL_RumbleJoystickTriggers|SDL_RunHapticEffect|SDL_SaveBMP|SDL_SaveBMP_IO|SDL_SendAndroidMessage|SDL_SendGamepadEffect|SDL_SendJoystickEffect|SDL_SendJoystickVirtualSensorData|SDL_SetAppMetadata|SDL_SetAppMetadataProperty|SDL_SetAudioDeviceGain|SDL_SetAudioPostmixCallback|SDL_SetAudioStreamFormat|SDL_SetAudioStreamFrequencyRatio|SDL_SetAudioStreamGain|SDL_SetAudioStreamGetCallback|SDL_SetAudioStreamInputChannelMap|SDL_SetAudioStreamOutputChannelMap|SDL_SetAudioStreamPutCallback|SDL_SetBooleanProperty|SDL_SetClipboardData|SDL_SetClipboardText|SDL_SetCursor|SDL_SetFloatProperty|SDL_SetGamepadLED|SDL_SetGamepadMapping|SDL_SetGamepadPlayerIndex|SDL_SetGamepadSensorEnabled|SDL_SetHapticAutocenter|SDL_SetHapticGain|SDL_SetJoystickLED|SDL_SetJoystickPlayerIndex|SDL_SetJoystickVirtualAxis|SDL_SetJoystickVirtualBall|SDL_SetJoystickVirtualButton|SDL_SetJoystickVirtualHat|SDL_SetJoystickVirtualTouchpad|SDL_SetLinuxThreadPriority|SDL_SetLinuxThreadPriorityAndPolicy|SDL_SetLogPriorityPrefix|SDL_SetMemoryFunctions|SDL_SetNumberProperty|SDL_SetPaletteColors|SDL_SetPointerProperty|SDL_SetPointerPropertyWithCleanup|SDL_SetPrimarySelectionText|SDL_SetRenderClipRect|SDL_SetRenderColorScale|SDL_SetRenderDrawBlendMode|SDL_SetRenderDrawColor|SDL_SetRenderDrawColorFloat|SDL_SetRenderLogicalPresentation|SDL_SetRenderScale|SDL_SetRenderTarget|SDL_SetRenderVSync|SDL_SetRenderViewport|SDL_SetScancodeName|SDL_SetStringProperty|SDL_SetSurfaceAlphaMod|SDL_SetSurfaceBlendMode|SDL_SetSurfaceColorKey|SDL_SetSurfaceColorMod|SDL_SetSurfaceColorspace|SDL_SetSurfacePalette|SDL_SetSurfaceRLE|SDL_SetTLS|SDL_SetTextInputArea|SDL_SetTextureAlphaMod|SDL_SetTextureAlphaModFloat|SDL_SetTextureBlendMode|SDL_SetTextureColorMod|SDL_SetTextureColorModFloat|SDL_SetTextureScaleMode|SDL_SetThreadPriority|SDL_SetWindowAlwaysOnTop|SDL_SetWindowAspectRatio|SDL_SetWindowBordered|SDL_SetWindowFocusable|SDL_SetWindowFullscreen|SDL_SetWindowFullscreenMode|SDL_SetWindowHitTest|SDL_SetWindowIcon|SDL_SetWindowKeyboardGrab|SDL_SetWindowMaximumSize|SDL_SetWindowMinimumSize|SDL_SetWindowModalFor|SDL_SetWindowMouseGrab|SDL_SetWindowMouseRect|SDL_SetWindowOpacity|SDL_SetWindowPosition|SDL_SetWindowRelativeMouseMode|SDL_SetWindowResizable|SDL_SetWindowShape|SDL_SetWindowSize|SDL_SetWindowSurfaceVSync|SDL_SetWindowTitle|SDL_SetiOSAnimationCallback|SDL_ShowAndroidToast|SDL_ShowCursor|SDL_ShowMessageBox|SDL_ShowSimpleMessageBox|SDL_ShowWindow|SDL_ShowWindowSystemMenu|SDL_StartTextInput|SDL_StartTextInputWithProperties|SDL_StopHapticEffect|SDL_StopHapticEffects|SDL_StopHapticRumble|SDL_StopTextInput|SDL_SyncWindow|SDL_TimeToDateTime|SDL_TryLockMutex|SDL_TryLockRWLockForReading|SDL_TryLockRWLockForWriting|SDL_TryWaitSemaphore|SDL_UnlockAudioStream|SDL_UpdateHapticEffect|SDL_UpdateNVTexture|SDL_UpdateTexture|SDL_UpdateWindowSurface|SDL_UpdateWindowSurfaceRects|SDL_UpdateYUVTexture|SDL_Vulkan_CreateSurface|SDL_Vulkan_LoadLibrary|SDL_WaitConditionTimeout|SDL_WaitSemaphoreTimeout|SDL_WarpMouseGlobal|SDL_WriteStorageFile|SDL_WriteSurfacePixel|SDL_WriteSurfacePixelFloat)$"; @@ ( func( ... ) - == 0 | - func( + !func( ... ) - < 0 | - func( + !func( ... ) - != 0 | - func( + !func( ... ) - == -1 )
346 lines
12 KiB
C
346 lines
12 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org>
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
#include "SDL_internal.h"
|
|
|
|
#ifdef SDL_PLATFORM_LINUX
|
|
|
|
#ifndef SDL_THREADS_DISABLED
|
|
#include <sys/time.h>
|
|
#include <sys/resource.h>
|
|
#include <pthread.h>
|
|
#include <sched.h>
|
|
#include <unistd.h>
|
|
|
|
// RLIMIT_RTTIME requires kernel >= 2.6.25 and is in glibc >= 2.14
|
|
#ifndef RLIMIT_RTTIME
|
|
#define RLIMIT_RTTIME 15
|
|
#endif
|
|
// SCHED_RESET_ON_FORK is in kernel >= 2.6.32.
|
|
#ifndef SCHED_RESET_ON_FORK
|
|
#define SCHED_RESET_ON_FORK 0x40000000
|
|
#endif
|
|
|
|
#include "SDL_dbus.h"
|
|
|
|
#ifdef SDL_USE_LIBDBUS
|
|
|
|
// d-bus queries to org.freedesktop.RealtimeKit1.
|
|
#define RTKIT_DBUS_NODE "org.freedesktop.RealtimeKit1"
|
|
#define RTKIT_DBUS_PATH "/org/freedesktop/RealtimeKit1"
|
|
#define RTKIT_DBUS_INTERFACE "org.freedesktop.RealtimeKit1"
|
|
|
|
// d-bus queries to the XDG portal interface to RealtimeKit1
|
|
#define XDG_PORTAL_DBUS_NODE "org.freedesktop.portal.Desktop"
|
|
#define XDG_PORTAL_DBUS_PATH "/org/freedesktop/portal/desktop"
|
|
#define XDG_PORTAL_DBUS_INTERFACE "org.freedesktop.portal.Realtime"
|
|
|
|
static bool rtkit_use_session_conn;
|
|
static const char *rtkit_dbus_node;
|
|
static const char *rtkit_dbus_path;
|
|
static const char *rtkit_dbus_interface;
|
|
|
|
static pthread_once_t rtkit_initialize_once = PTHREAD_ONCE_INIT;
|
|
static Sint32 rtkit_min_nice_level = -20;
|
|
static Sint32 rtkit_max_realtime_priority = 99;
|
|
static Sint64 rtkit_max_rttime_usec = 200000;
|
|
|
|
/*
|
|
* Checking that the RTTimeUSecMax property exists and is an int64 confirms that:
|
|
* - The desktop portal exists and supports the realtime interface.
|
|
* - The realtime interface is new enough to have the required bug fixes applied.
|
|
*/
|
|
static bool realtime_portal_supported(DBusConnection *conn)
|
|
{
|
|
Sint64 res;
|
|
return SDL_DBus_QueryPropertyOnConnection(conn, XDG_PORTAL_DBUS_NODE, XDG_PORTAL_DBUS_PATH, XDG_PORTAL_DBUS_INTERFACE,
|
|
"RTTimeUSecMax", DBUS_TYPE_INT64, &res);
|
|
}
|
|
|
|
static void set_rtkit_interface(void)
|
|
{
|
|
SDL_DBusContext *dbus = SDL_DBus_GetContext();
|
|
|
|
// xdg-desktop-portal works in all instances, so check for it first.
|
|
if (dbus && realtime_portal_supported(dbus->session_conn)) {
|
|
rtkit_use_session_conn = true;
|
|
rtkit_dbus_node = XDG_PORTAL_DBUS_NODE;
|
|
rtkit_dbus_path = XDG_PORTAL_DBUS_PATH;
|
|
rtkit_dbus_interface = XDG_PORTAL_DBUS_INTERFACE;
|
|
} else { // Fall back to the standard rtkit interface in all other cases.
|
|
rtkit_use_session_conn = false;
|
|
rtkit_dbus_node = RTKIT_DBUS_NODE;
|
|
rtkit_dbus_path = RTKIT_DBUS_PATH;
|
|
rtkit_dbus_interface = RTKIT_DBUS_INTERFACE;
|
|
}
|
|
}
|
|
|
|
static DBusConnection *get_rtkit_dbus_connection(void)
|
|
{
|
|
SDL_DBusContext *dbus = SDL_DBus_GetContext();
|
|
|
|
if (dbus) {
|
|
return rtkit_use_session_conn ? dbus->session_conn : dbus->system_conn;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static void rtkit_initialize(void)
|
|
{
|
|
DBusConnection *dbus_conn;
|
|
|
|
set_rtkit_interface();
|
|
dbus_conn = get_rtkit_dbus_connection();
|
|
|
|
// Try getting minimum nice level: this is often greater than PRIO_MIN (-20).
|
|
if (!dbus_conn || !SDL_DBus_QueryPropertyOnConnection(dbus_conn, rtkit_dbus_node, rtkit_dbus_path, rtkit_dbus_interface, "MinNiceLevel",
|
|
DBUS_TYPE_INT32, &rtkit_min_nice_level)) {
|
|
rtkit_min_nice_level = -20;
|
|
}
|
|
|
|
// Try getting maximum realtime priority: this can be less than the POSIX default (99).
|
|
if (!dbus_conn || !SDL_DBus_QueryPropertyOnConnection(dbus_conn, rtkit_dbus_node, rtkit_dbus_path, rtkit_dbus_interface, "MaxRealtimePriority",
|
|
DBUS_TYPE_INT32, &rtkit_max_realtime_priority)) {
|
|
rtkit_max_realtime_priority = 99;
|
|
}
|
|
|
|
// Try getting maximum rttime allowed by rtkit: exceeding this value will result in SIGKILL
|
|
if (!dbus_conn || !SDL_DBus_QueryPropertyOnConnection(dbus_conn, rtkit_dbus_node, rtkit_dbus_path, rtkit_dbus_interface, "RTTimeUSecMax",
|
|
DBUS_TYPE_INT64, &rtkit_max_rttime_usec)) {
|
|
rtkit_max_rttime_usec = 200000;
|
|
}
|
|
}
|
|
|
|
static bool rtkit_initialize_realtime_thread(void)
|
|
{
|
|
// Following is an excerpt from rtkit README that outlines the requirements
|
|
// a thread must meet before making rtkit requests:
|
|
//
|
|
// * Only clients with RLIMIT_RTTIME set will get RT scheduling
|
|
//
|
|
// * RT scheduling will only be handed out to processes with
|
|
// SCHED_RESET_ON_FORK set to guarantee that the scheduling
|
|
// settings cannot 'leak' to child processes, thus making sure
|
|
// that 'RT fork bombs' cannot be used to bypass RLIMIT_RTTIME
|
|
// and take the system down.
|
|
//
|
|
// * Limits are enforced on all user controllable resources, only
|
|
// a maximum number of users, processes, threads can request RT
|
|
// scheduling at the same time.
|
|
//
|
|
// * Only a limited number of threads may be made RT in a
|
|
// specific time frame.
|
|
//
|
|
// * Client authorization is verified with PolicyKit
|
|
|
|
int err;
|
|
struct rlimit rlimit;
|
|
int nLimit = RLIMIT_RTTIME;
|
|
pid_t nPid = 0; // self
|
|
int nSchedPolicy = sched_getscheduler(nPid) | SCHED_RESET_ON_FORK;
|
|
struct sched_param schedParam;
|
|
|
|
SDL_zero(schedParam);
|
|
|
|
// Requirement #1: Set RLIMIT_RTTIME
|
|
err = getrlimit(nLimit, &rlimit);
|
|
if (err) {
|
|
return false;
|
|
}
|
|
|
|
// Current rtkit allows a max of 200ms right now
|
|
rlimit.rlim_max = rtkit_max_rttime_usec;
|
|
rlimit.rlim_cur = rlimit.rlim_max / 2;
|
|
err = setrlimit(nLimit, &rlimit);
|
|
if (err) {
|
|
return false;
|
|
}
|
|
|
|
// Requirement #2: Add SCHED_RESET_ON_FORK to the scheduler policy
|
|
err = sched_getparam(nPid, &schedParam);
|
|
if (err) {
|
|
return false;
|
|
}
|
|
|
|
err = sched_setscheduler(nPid, nSchedPolicy, &schedParam);
|
|
if (err) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool rtkit_setpriority_nice(pid_t thread, int nice_level)
|
|
{
|
|
DBusConnection *dbus_conn;
|
|
Uint64 pid = (Uint64)getpid();
|
|
Uint64 tid = (Uint64)thread;
|
|
Sint32 nice = (Sint32)nice_level;
|
|
|
|
pthread_once(&rtkit_initialize_once, rtkit_initialize);
|
|
dbus_conn = get_rtkit_dbus_connection();
|
|
|
|
if (nice < rtkit_min_nice_level) {
|
|
nice = rtkit_min_nice_level;
|
|
}
|
|
|
|
if (!dbus_conn || !SDL_DBus_CallMethodOnConnection(dbus_conn,
|
|
rtkit_dbus_node, rtkit_dbus_path, rtkit_dbus_interface, "MakeThreadHighPriorityWithPID",
|
|
DBUS_TYPE_UINT64, &pid, DBUS_TYPE_UINT64, &tid, DBUS_TYPE_INT32, &nice, DBUS_TYPE_INVALID,
|
|
DBUS_TYPE_INVALID)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static bool rtkit_setpriority_realtime(pid_t thread, int rt_priority)
|
|
{
|
|
DBusConnection *dbus_conn;
|
|
Uint64 pid = (Uint64)getpid();
|
|
Uint64 tid = (Uint64)thread;
|
|
Uint32 priority = (Uint32)rt_priority;
|
|
|
|
pthread_once(&rtkit_initialize_once, rtkit_initialize);
|
|
dbus_conn = get_rtkit_dbus_connection();
|
|
|
|
if (priority > rtkit_max_realtime_priority) {
|
|
priority = rtkit_max_realtime_priority;
|
|
}
|
|
|
|
// We always perform the thread state changes necessary for rtkit.
|
|
// This wastes some system calls if the state is already set but
|
|
// typically code sets a thread priority and leaves it so it's
|
|
// not expected that this wasted effort will be an issue.
|
|
// We also do not quit if this fails, we let the rtkit request
|
|
// go through to determine whether it really needs to fail or not.
|
|
rtkit_initialize_realtime_thread();
|
|
|
|
if (!dbus_conn || !SDL_DBus_CallMethodOnConnection(dbus_conn,
|
|
rtkit_dbus_node, rtkit_dbus_path, rtkit_dbus_interface, "MakeThreadRealtimeWithPID",
|
|
DBUS_TYPE_UINT64, &pid, DBUS_TYPE_UINT64, &tid, DBUS_TYPE_UINT32, &priority, DBUS_TYPE_INVALID,
|
|
DBUS_TYPE_INVALID)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
#else
|
|
|
|
#define rtkit_max_realtime_priority 99
|
|
|
|
#endif // dbus
|
|
#endif // threads
|
|
|
|
// this is a public symbol, so it has to exist even if threads are disabled.
|
|
SDL_bool SDL_SetLinuxThreadPriority(Sint64 threadID, int priority)
|
|
{
|
|
#ifdef SDL_THREADS_DISABLED
|
|
return SDL_Unsupported();
|
|
#else
|
|
if (setpriority(PRIO_PROCESS, (id_t)threadID, priority) == 0) {
|
|
return true;
|
|
}
|
|
|
|
#ifdef SDL_USE_LIBDBUS
|
|
/* Note that this fails you most likely:
|
|
* Have your process's scheduler incorrectly configured.
|
|
See the requirements at:
|
|
http://git.0pointer.net/rtkit.git/tree/README#n16
|
|
* Encountered dbus/polkit security restrictions. Note
|
|
that the RealtimeKit1 dbus endpoint is inaccessible
|
|
over ssh connections for most common distro configs.
|
|
You might want to check your local config for details:
|
|
/usr/share/polkit-1/actions/org.freedesktop.RealtimeKit1.policy
|
|
|
|
README and sample code at: http://git.0pointer.net/rtkit.git
|
|
*/
|
|
if (rtkit_setpriority_nice((pid_t)threadID, priority)) {
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
return SDL_SetError("setpriority() failed");
|
|
#endif
|
|
}
|
|
|
|
// this is a public symbol, so it has to exist even if threads are disabled.
|
|
SDL_bool SDL_SetLinuxThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy)
|
|
{
|
|
#ifdef SDL_THREADS_DISABLED
|
|
return SDL_Unsupported();
|
|
#else
|
|
int osPriority;
|
|
|
|
if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) {
|
|
if (sdlPriority == SDL_THREAD_PRIORITY_LOW) {
|
|
osPriority = 1;
|
|
} else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) {
|
|
osPriority = rtkit_max_realtime_priority * 3 / 4;
|
|
} else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) {
|
|
osPriority = rtkit_max_realtime_priority;
|
|
} else {
|
|
osPriority = rtkit_max_realtime_priority / 2;
|
|
}
|
|
} else {
|
|
if (sdlPriority == SDL_THREAD_PRIORITY_LOW) {
|
|
osPriority = 19;
|
|
} else if (sdlPriority == SDL_THREAD_PRIORITY_HIGH) {
|
|
osPriority = -10;
|
|
} else if (sdlPriority == SDL_THREAD_PRIORITY_TIME_CRITICAL) {
|
|
osPriority = -20;
|
|
} else {
|
|
osPriority = 0;
|
|
}
|
|
|
|
if (setpriority(PRIO_PROCESS, (id_t)threadID, osPriority) == 0) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
#ifdef SDL_USE_LIBDBUS
|
|
/* Note that this fails you most likely:
|
|
* Have your process's scheduler incorrectly configured.
|
|
See the requirements at:
|
|
http://git.0pointer.net/rtkit.git/tree/README#n16
|
|
* Encountered dbus/polkit security restrictions. Note
|
|
that the RealtimeKit1 dbus endpoint is inaccessible
|
|
over ssh connections for most common distro configs.
|
|
You might want to check your local config for details:
|
|
/usr/share/polkit-1/actions/org.freedesktop.RealtimeKit1.policy
|
|
|
|
README and sample code at: http://git.0pointer.net/rtkit.git
|
|
*/
|
|
if (schedPolicy == SCHED_RR || schedPolicy == SCHED_FIFO) {
|
|
if (rtkit_setpriority_realtime((pid_t)threadID, osPriority)) {
|
|
return true;
|
|
}
|
|
} else {
|
|
if (rtkit_setpriority_nice((pid_t)threadID, osPriority)) {
|
|
return true;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return SDL_SetError("setpriority() failed");
|
|
#endif
|
|
}
|
|
|
|
#endif // SDL_PLATFORM_LINUX
|