SDL
2.0
|
#include "../SDL_internal.h"
#include "SDL_assert.h"
#include "SDL_thread.h"
#include "SDL_thread_c.h"
#include "SDL_systhread.h"
#include "SDL_hints.h"
#include "../SDL_error_c.h"
Go to the source code of this file.
Data Structures | |
struct | SDL_TLSEntry |
struct | thread_args |
Macros | |
#define | SDL_CreateThread SDL_CreateThread_REAL |
Functions | |
SDL_TLSID | SDL_TLSCreate () |
Create an identifier that is globally visible to all threads but refers to data that is thread-specific. More... | |
void * | SDL_TLSGet (SDL_TLSID id) |
Get the value associated with a thread local storage ID for the current thread. More... | |
int | SDL_TLSSet (SDL_TLSID id, const void *value, void(*destructor)(void *)) |
Set the value associated with a thread local storage ID for the current thread. More... | |
static void | SDL_TLSCleanup () |
SDL_TLSData * | SDL_Generic_GetTLSData (void) |
int | SDL_Generic_SetTLSData (SDL_TLSData *storage) |
SDL_error * | SDL_GetErrBuf (void) |
void | SDL_RunThread (void *data) |
static SDL_Thread * | SDL_CreateThreadWithStackSize (int(*fn)(void *), const char *name, const size_t stacksize, void *data) |
SDL_Thread * | SDL_CreateThread (int(*fn)(void *), const char *name, void *data) |
SDL_Thread * | SDL_CreateThreadInternal (int(*fn)(void *), const char *name, const size_t stacksize, void *data) |
SDL_threadID | SDL_GetThreadID (SDL_Thread *thread) |
const char * | SDL_GetThreadName (SDL_Thread *thread) |
int | SDL_SetThreadPriority (SDL_ThreadPriority priority) |
void | SDL_WaitThread (SDL_Thread *thread, int *status) |
void | SDL_DetachThread (SDL_Thread *thread) |
Variables | |
static SDL_mutex * | SDL_generic_TLS_mutex |
static SDL_TLSEntry * | SDL_generic_TLS |
#define SDL_CreateThread SDL_CreateThread_REAL |
Definition at line 304 of file SDL_thread.c.
Referenced by SDL_CreateThreadWithStackSize().
SDL_Thread* SDL_CreateThread | ( | int(*)(void *) | fn, |
const char * | name, | ||
void * | data | ||
) |
Definition at line 400 of file SDL_thread.c.
References NULL, SDL_CreateThreadWithStackSize(), SDL_GetHint, SDL_HINT_THREAD_STACK_SIZE, and SDL_strtoll.
SDL_Thread* SDL_CreateThreadInternal | ( | int(*)(void *) | fn, |
const char * | name, | ||
const size_t | stacksize, | ||
void * | data | ||
) |
Definition at line 427 of file SDL_thread.c.
References NULL, and SDL_CreateThreadWithStackSize().
Referenced by open_audio_device(), and SDL_TimerInit().
|
static |
Definition at line 315 of file SDL_thread.c.
References thread_args::data, DECLSPEC, thread_args::func, thread_args::info, SDL_Thread::name, NULL, SDL_AtomicSet, SDL_CreateSemaphore, SDL_CreateThread, SDL_DestroySemaphore, SDL_free, SDL_malloc, SDL_OutOfMemory, SDL_SemWait, SDL_strdup, SDL_SYS_CreateThread(), SDL_THREAD_STATE_ALIVE, SDL_zerop, SDLCALL, SDL_Thread::stacksize, SDL_Thread::state, SDL_Thread::status, SDL_TLSEntry::thread, and thread_args::wait.
Referenced by SDL_CreateThread(), and SDL_CreateThreadInternal().
void SDL_DetachThread | ( | SDL_Thread * | thread | ) |
A thread may be "detached" to signify that it should not remain until another thread has called SDL_WaitThread() on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
There is no way to recover the return code of a detached thread. If you need this, don't detach the thread and instead use SDL_WaitThread().
Once a thread is detached, you should usually assume the SDL_Thread isn't safe to reference again, as it will become invalid immediately upon the detached thread's exit, instead of remaining until someone has called SDL_WaitThread() to finally clean it up. As such, don't detach the same thread more than once.
If a thread has already exited when passed to SDL_DetachThread(), it will stop waiting for a call to SDL_WaitThread() and clean up immediately. It is not safe to detach a thread that might be used with SDL_WaitThread().
You may not call SDL_WaitThread() on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
It is safe to pass NULL to this function; it is a no-op.
Definition at line 481 of file SDL_thread.c.
References NULL, SDL_assert, SDL_AtomicCAS, SDL_AtomicGet, SDL_SYS_DetachThread(), SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_CLEANED, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_ZOMBIE, SDL_WaitThread(), and SDL_Thread::state.
SDL_TLSData* SDL_Generic_GetTLSData | ( | void | ) |
Definition at line 124 of file SDL_thread.c.
References mutex, SDL_TLSEntry::next, NULL, SDL_AtomicLock, SDL_AtomicUnlock, SDL_CreateMutex, SDL_LockMutex, SDL_MemoryBarrierAcquire, SDL_MemoryBarrierRelease, SDL_ThreadID, SDL_UnlockMutex, SDL_TLSEntry::storage, and SDL_TLSEntry::thread.
Referenced by SDL_SYS_GetTLSData().
int SDL_Generic_SetTLSData | ( | SDL_TLSData * | storage | ) |
Definition at line 163 of file SDL_thread.c.
References SDL_TLSEntry::next, NULL, SDL_free, SDL_generic_TLS, SDL_LockMutex, SDL_malloc, SDL_OutOfMemory, SDL_ThreadID, SDL_UnlockMutex, SDL_TLSEntry::storage, and SDL_TLSEntry::thread.
Referenced by SDL_SYS_SetTLSData().
Definition at line 206 of file SDL_thread.c.
References NULL, SDL_AtomicLock, SDL_AtomicUnlock, SDL_FALSE, SDL_free, SDL_malloc, SDL_MemoryBarrierAcquire, SDL_MemoryBarrierRelease, SDL_TLSCreate(), SDL_TLSGet(), SDL_TLSSet(), SDL_TRUE, and SDL_zerop.
Referenced by SDL_ClearError(), SDL_GetErrorMsg(), and SDL_SetError().
SDL_threadID SDL_GetThreadID | ( | SDL_Thread * | thread | ) |
Get the thread identifier for the specified thread.
Equivalent to SDL_ThreadID() if the specified thread is NULL.
Definition at line 437 of file SDL_thread.c.
References SDL_ThreadID, and SDL_Thread::threadid.
const char* SDL_GetThreadName | ( | SDL_Thread * | thread | ) |
Get the thread name, as it was specified in SDL_CreateThread(). This function returns a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn't have a name. This is internal memory, not to be free()'d by the caller, and remains valid until the specified thread is cleaned up by SDL_WaitThread().
Definition at line 450 of file SDL_thread.c.
References SDL_Thread::name, and NULL.
Definition at line 265 of file SDL_thread.c.
References thread_args::data, thread_args::func, thread_args::info, SDL_AtomicCAS, SDL_free, SDL_SemPost, SDL_SYS_SetupThread(), SDL_THREAD_STATE_ALIVE, SDL_THREAD_STATE_CLEANED, SDL_THREAD_STATE_DETACHED, SDL_THREAD_STATE_ZOMBIE, SDL_ThreadID, SDL_TLSCleanup(), SDLCALL, SDL_TLSEntry::thread, and thread_args::wait.
Referenced by RunThread().
int SDL_SetThreadPriority | ( | SDL_ThreadPriority | priority | ) |
Set the priority for the current thread
Definition at line 460 of file SDL_thread.c.
References SDL_SYS_SetThreadPriority().
|
static |
Definition at line 87 of file SDL_thread.c.
References SDL_TLSData::array, SDL_TLSData::data, SDL_TLSData::destructor, i, SDL_TLSData::limit, NULL, SDL_free, SDL_SYS_GetTLSData(), and SDL_SYS_SetTLSData().
Referenced by SDL_RunThread().
Create an identifier that is globally visible to all threads but refers to data that is thread-specific.
Definition at line 34 of file SDL_thread.c.
References SDL_AtomicIncRef.
Referenced by SDL_GetErrBuf().
Get the value associated with a thread local storage ID for the current thread.
id | The thread local storage ID |
Definition at line 41 of file SDL_thread.c.
References SDL_TLSData::array, SDL_TLSData::data, SDL_TLSData::limit, NULL, and SDL_SYS_GetTLSData().
Referenced by SDL_GetErrBuf().
Set the value associated with a thread local storage ID for the current thread.
id | The thread local storage ID |
value | The value to associate with the ID for the current thread |
destructor | A function called when the thread exits, to free the value. |
Definition at line 53 of file SDL_thread.c.
References SDL_TLSData::array, SDL_TLSData::data, SDL_TLSData::destructor, i, SDL_TLSData::limit, NULL, SDL_const_cast, SDL_InvalidParamError, SDL_OutOfMemory, SDL_realloc, SDL_SYS_GetTLSData(), SDL_SYS_SetTLSData(), and TLS_ALLOC_CHUNKSIZE.
Referenced by SDL_GetErrBuf().
void SDL_WaitThread | ( | SDL_Thread * | thread, |
int * | status | ||
) |
Wait for a thread to finish. Threads that haven't been detached will remain (as a "zombie") until this function cleans them up. Not doing so is a resource leak.
Once a thread has been cleaned up through this function, the SDL_Thread that references it becomes invalid and should not be referenced again. As such, only one thread may call SDL_WaitThread() on another.
The return code for the thread function is placed in the area pointed to by status
, if status
is not NULL.
You may not wait on a thread that has been used in a call to SDL_DetachThread(). Use either that function or this one, but not both, or behavior is undefined.
It is safe to pass NULL to this function; it is a no-op.
Definition at line 466 of file SDL_thread.c.
References SDL_Thread::name, SDL_free, SDL_SYS_WaitThread(), and SDL_Thread::status.
Referenced by SDL_DetachThread().
|
static |
Definition at line 120 of file SDL_thread.c.
Referenced by SDL_Generic_SetTLSData().
|
static |
Definition at line 119 of file SDL_thread.c.