SDL_systhread.c File Reference
`#include "../../SDL_internal.h"`
`#include <pthread.h>`
`#include <signal.h>`
`#include "SDL_platform.h"`
`#include "SDL_thread.h"`
`#include "../SDL_thread_c.h"`
`#include "../SDL_systhread.h"`
`#include "SDL_assert.h"`
Include dependency graph for SDL_systhread.c:

Go to the source code of this file.

## Functions

static void * | RunThread (void *data)
int | SDL_SYS_CreateThread (SDL_Thread *thread, void *args)
void | SDL_SYS_SetupThread (const char *name)
SDL_threadID | SDL_ThreadID (void)
int | SDL_SYS_SetThreadPriority (SDL_ThreadPriority priority)
void | SDL_SYS_WaitThread (SDL_Thread *thread)
void | SDL_SYS_DetachThread (SDL_Thread *thread)

## Variables

static const int | sig_list []

## Function Documentation

## RunThread()

static void* RunThread | ( | void * | data | ) |

static

Definition at line 69 of file SDL_systhread.c.

References Android_JNI_SetupThread(), NULL, SDL_FALSE, and SDL_RunThread().

Referenced by SDL_SYS_CreateThread().

{
#ifdef __ANDROID__
Android_JNI_SetupThread();
#endif
SDL_RunThread(data);
return NULL;
}
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: SDL_opengl.h:1974
Android_JNI_SetupThread
int Android_JNI_SetupThread(void)
NULL
#define NULL
Definition: begin_code.h:164
SDL_RunThread
void SDL_RunThread(void *data)
Definition: SDL_thread.c:265

## SDL_SYS_CreateThread()

int SDL_SYS_CreateThread | ( | SDL_Thread * | thread,
|  | void * | args
| ) |  |

Definition at line 86 of file SDL_systhread.c.

References SDL_Thread::handle, RunThread(), SDL_SetError, SDL_TRUE, and SDL_Thread::stacksize.

{
pthread_attr_t type;
/* do this here before any threads exist, so there's no race condition. */
#if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__LINUX__)
if (!checked_setname) {
void *fn = dlsym(RTLD_DEFAULT, "pthread_setname_np");
#if defined(__MACOSX__) || defined(__IPHONEOS__)
ppthread_setname_np = (int(*)(const char*)) fn;
#elif defined(__LINUX__)
ppthread_setname_np = (int(*)(pthread_t, const char*)) fn;
#endif
checked_setname = SDL_TRUE;
}
#endif
/* Set the thread attributes */
if (pthread_attr_init(&type) != 0) {
return SDL_SetError("Couldn't initialize pthread attributes");
}
pthread_attr_setdetachstate(&type, PTHREAD_CREATE_JOINABLE);
/* Set caller-requested stack size. Otherwise: use the system default. */
if (thread->stacksize) {
pthread_attr_setstacksize(&type, (size_t) thread->stacksize);
}
/* Create the thread and go! */
if (pthread_create(&thread->handle, &type, RunThread, args) != 0) {
return SDL_SetError("Not enough resources to create thread");
}
return 0;
}
SDL_TRUE
Definition: SDL_stdinc.h:142
RunThread
static void * RunThread(void *data)
Definition: SDL_systhread.c:69
SDL_Thread::handle
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
SDL_Thread::stacksize
size_t stacksize
Definition: SDL_thread_c.h:62

## SDL_SYS_DetachThread()

void SDL_SYS_DetachThread | ( | SDL_Thread * | thread | ) |

Definition at line 241 of file SDL_systhread.c.

References SDL_Thread::handle.

{
pthread_detach(thread->handle);
}
SDL_Thread::handle
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57

## SDL_SYS_SetThreadPriority()

int SDL_SYS_SetThreadPriority | ( | SDL_ThreadPriority | priority | ) |

Definition at line 184 of file SDL_systhread.c.

References SDL_SetError, SDL_THREAD_PRIORITY_HIGH, and SDL_THREAD_PRIORITY_LOW.

{
#if __NACL__
/* FIXME: Setting thread priority does not seem to be supported in NACL */
return 0;
#elif __LINUX__
int value;
if (priority == SDL_THREAD_PRIORITY_LOW) {
value = 19;
} else if (priority == SDL_THREAD_PRIORITY_HIGH) {
value = -20;
} else {
value = 0;
}
if (setpriority(PRIO_PROCESS, syscall(SYS_gettid), 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>
*/
return SDL_SetError("setpriority() failed");
}
return 0;
#else
struct sched_param sched;
int policy;
pthread_t thread = pthread_self();
if (pthread_getschedparam(thread, &policy, &sched) != 0) {
return SDL_SetError("pthread_getschedparam() failed");
}
if (priority == SDL_THREAD_PRIORITY_LOW) {
sched.sched_priority = sched_get_priority_min(policy);
} else if (priority == SDL_THREAD_PRIORITY_HIGH) {
sched.sched_priority = sched_get_priority_max(policy);
} else {
int min_priority = sched_get_priority_min(policy);
int max_priority = sched_get_priority_max(policy);
sched.sched_priority = (min_priority + (max_priority - min_priority) / 2);
}
if (pthread_setschedparam(thread, policy, &sched) != 0) {
return SDL_SetError("pthread_setschedparam() failed");
}
return 0;
#endif /* linux */
}
policy
EGLint policy
Definition: eglext.h:593
SDL_THREAD_PRIORITY_HIGH
Definition: SDL_thread.h:62
value
GLsizei const GLfloat * value
Definition: SDL_opengl_glext.h:698
SDL_THREAD_PRIORITY_LOW
Definition: SDL_thread.h:60
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30

## SDL_SYS_SetupThread()

void SDL_SYS_SetupThread | ( | const char * | name | ) |

Definition at line 123 of file SDL_systhread.c.

References i, NULL, SDL_assert, SDL_snprintf, and sig_list.

{
#if !defined(__NACL__)
int i;
sigset_t mask;
#endif /* !__NACL__ */
if (name != NULL) {
#if defined(__MACOSX__) || defined(__IPHONEOS__) || defined(__LINUX__)
SDL_assert(checked_setname);
if (ppthread_setname_np != NULL) {
#if defined(__MACOSX__) || defined(__IPHONEOS__)
ppthread_setname_np(name);
#elif defined(__LINUX__)
ppthread_setname_np(pthread_self(), name);
#endif
}
#elif HAVE_PTHREAD_SETNAME_NP
#if defined(__NETBSD__)
pthread_setname_np(pthread_self(), "%s", name);
#else
pthread_setname_np(pthread_self(), name);
#endif
#elif HAVE_PTHREAD_SET_NAME_NP
pthread_set_name_np(pthread_self(), name);
#elif defined(__HAIKU__)
/* The docs say the thread name can't be longer than B_OS_NAME_LENGTH. */
char namebuf[B_OS_NAME_LENGTH];
SDL_snprintf(namebuf, sizeof (namebuf), "%s", name);
namebuf[sizeof (namebuf) - 1] = '\0';
rename_thread(find_thread(NULL), namebuf);
#endif
}
/* NativeClient does not yet support signals.*/
#if !defined(__NACL__)
/* Mask asynchronous signals for this thread */
sigemptyset(&mask);
for (i = 0; sig_list[i]; ++i) {
sigaddset(&mask, sig_list[i]);
}
pthread_sigmask(SIG_BLOCK, &mask, 0);
#endif /* !__NACL__ */
#ifdef PTHREAD_CANCEL_ASYNCHRONOUS
/* Allow ourselves to be asynchronously cancelled */
{
int oldstate;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldstate);
}
#endif
}
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:660
mask
GLenum GLint GLuint mask
Definition: SDL_opengl_glext.h:657
sig_list
static const int sig_list[]
Definition: SDL_systhread.c:62
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
NULL
#define NULL
Definition: begin_code.h:164
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40

## SDL_SYS_WaitThread()

void SDL_SYS_WaitThread | ( | SDL_Thread * | thread | ) |

Definition at line 235 of file SDL_systhread.c.

References SDL_Thread::handle.

{
pthread_join(thread->handle, 0);
}
SDL_Thread::handle
SYS_ThreadHandle handle
Definition: SDL_thread_c.h:57

## SDL_ThreadID()

SDL_threadID SDL_ThreadID | ( | void |  | ) |

Get the thread identifier for the current thread.

Definition at line 178 of file SDL_systhread.c.

{
return ((SDL_threadID) pthread_self());
}
SDL_threadID
unsigned long SDL_threadID
Definition: SDL_thread.h:49

## Variable Documentation

## sig_list

const int sig_list[]

static

Initial value:
= {
SIGHUP, SIGINT, SIGQUIT, SIGPIPE, SIGALRM, SIGTERM, SIGCHLD, SIGWINCH,
SIGVTALRM, SIGPROF, 0
}

Definition at line 62 of file SDL_systhread.c.

Referenced by SDL_SYS_SetupThread().