1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* 2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Simple DirectMedia Layer 3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> 4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot This software is provided 'as-is', without any express or implied 6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot warranty. In no event will the authors be held liable for any damages 7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot arising from the use of this software. 8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Permission is granted to anyone to use this software for any purpose, 10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot including commercial applications, and to alter it and redistribute it 11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot freely, subject to the following restrictions: 12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 1. The origin of this software must not be misrepresented; you must not 14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot claim that you wrote the original software. If you use this software 15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot in a product, an acknowledgment in the product documentation would be 16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot appreciated but is not required. 17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 2. Altered source versions must be plainly marked as such, and must not be 18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot misrepresented as being the original software. 19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 3. This notice may not be removed or altered from any source distribution. 20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/ 21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef _SDL_thread_h 23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define _SDL_thread_h 24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \file SDL_thread.h 27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Header for the SDL thread management routines. 29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_stdinc.h" 32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_error.h" 33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Thread synchronization primitives */ 35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_atomic.h" 36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL_mutex.h" 37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "begin_code.h" 39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Set up for C function definitions, even when using C++ */ 40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifdef __cplusplus 41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern "C" { 42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* The SDL thread structure, defined in SDL_thread.c */ 45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstruct SDL_Thread; 46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef struct SDL_Thread SDL_Thread; 47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* The SDL thread ID */ 49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef unsigned long SDL_threadID; 50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Thread local storage ID, 0 is the invalid ID */ 52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef unsigned int SDL_TLSID; 53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * The SDL thread priority. 56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \note On many systems you require special privileges to set high priority. 58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef enum { 60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot SDL_THREAD_PRIORITY_LOW, 61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot SDL_THREAD_PRIORITY_NORMAL, 62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot SDL_THREAD_PRIORITY_HIGH 63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} SDL_ThreadPriority; 64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * The function passed to SDL_CreateThread(). 67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * It is passed a void* user context parameter and returns an int. 68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef int (SDLCALL * SDL_ThreadFunction) (void *data); 70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(__WIN32__) && !defined(HAVE_LIBC) 72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \file SDL_thread.h 74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * We compile SDL into a DLL. This means, that it's the DLL which 76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * creates a new thread for the calling process with the SDL_CreateThread() 77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * API. There is a problem with this, that only the RTL of the SDL.DLL will 78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * be initialized for those threads, and not the RTL of the calling 79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * application! 80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * To solve this, we make a little hack here. 82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * We'll always use the caller's _beginthread() and _endthread() APIs to 84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * start a new thread. This way, if it's the SDL.DLL which uses this API, 85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * then the RTL of SDL.DLL will be used to create the new thread, and if it's 86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * the application, then the RTL of the application will be used. 87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * So, in short: 89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Always use the _beginthread() and _endthread() of the calling runtime 90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * library! 91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define SDL_PASSED_BEGINTHREAD_ENDTHREAD 93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <process.h> /* This has _beginthread() and _endthread() defined! */ 94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, 96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot unsigned (__stdcall * 97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot func) (void 98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot *), 99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void *arg, unsigned, 100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot unsigned *threadID); 101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robottypedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); 102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Create a thread. 105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC SDL_Thread *SDLCALL 107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotSDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, 108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot pfnSDL_CurrentBeginThread pfnBeginThread, 109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot pfnSDL_CurrentEndThread pfnEndThread); 110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Create a thread. 113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if defined(SDL_CreateThread) && SDL_DYNAMIC_API 115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#undef SDL_CreateThread 116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) 117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)_beginthreadex, (pfnSDL_CurrentEndThread)_endthreadex) 119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#else 122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Create a thread. 125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Thread naming is a little complicated: Most systems have very small 127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * limits for the string length (Haiku has 32 bytes, Linux currently has 16, 128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Visual C++ 6.0 has nine!), and possibly other arbitrary rules. You'll 129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * have to see what happens with your system's debugger. The name should be 130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * UTF-8 (but using the naming limits of C identifiers is a better bet). 131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * There are no requirements for thread naming conventions, so long as the 132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * string is null-terminated UTF-8, but these guidelines are helpful in 133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * choosing a name: 134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * http://stackoverflow.com/questions/149932/naming-conventions-for-threads 136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * If a system imposes requirements, SDL will try to munge the string for 138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * it (truncate, etc), but the original string contents will be available 139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * from SDL_GetThreadName(). 140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC SDL_Thread *SDLCALL 142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotSDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); 143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Get the thread name, as it was specified in SDL_CreateThread(). 148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * This function returns a pointer to a UTF-8 string that names the 149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * specified thread, or NULL if it doesn't have a name. This is internal 150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * memory, not to be free()'d by the caller, and remains valid until the 151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * specified thread is cleaned up by SDL_WaitThread(). 152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread); 154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Get the thread identifier for the current thread. 157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); 159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Get the thread identifier for the specified thread. 162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Equivalent to SDL_ThreadID() if the specified thread is NULL. 164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); 166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Set the priority for the current thread 169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); 171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Wait for a thread to finish. Threads that haven't been detached will 174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * remain (as a "zombie") until this function cleans them up. Not doing so 175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * is a resource leak. 176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Once a thread has been cleaned up through this function, the SDL_Thread 178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * that references it becomes invalid and should not be referenced again. 179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * As such, only one thread may call SDL_WaitThread() on another. 180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * The return code for the thread function is placed in the area 182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * pointed to by \c status, if \c status is not NULL. 183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * You may not wait on a thread that has been used in a call to 185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * SDL_DetachThread(). Use either that function or this one, but not 186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * both, or behavior is undefined. 187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * It is safe to pass NULL to this function; it is a no-op. 189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); 191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 192555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 193555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * A thread may be "detached" to signify that it should not remain until 194555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * another thread has called SDL_WaitThread() on it. Detaching a thread 195555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * is useful for long-running threads that nothing needs to synchronize 196555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * with or further manage. When a detached thread is done, it simply 197555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * goes away. 198555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 199555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * There is no way to recover the return code of a detached thread. If you 200555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * need this, don't detach the thread and instead use SDL_WaitThread(). 201555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 202555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Once a thread is detached, you should usually assume the SDL_Thread isn't 203555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * safe to reference again, as it will become invalid immediately upon 204555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * the detached thread's exit, instead of remaining until someone has called 205555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * SDL_WaitThread() to finally clean it up. As such, don't detach the same 206555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * thread more than once. 207555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 208555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * If a thread has already exited when passed to SDL_DetachThread(), it will 209555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * stop waiting for a call to SDL_WaitThread() and clean up immediately. 210555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * It is not safe to detach a thread that might be used with SDL_WaitThread(). 211555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 212555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * You may not call SDL_WaitThread() on a thread that has been detached. 213555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * Use either that function or this one, but not both, or behavior is 214555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * undefined. 215555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 216555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * It is safe to pass NULL to this function; it is a no-op. 217555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 218555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread); 219555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 220555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 221555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \brief Create an identifier that is globally visible to all threads but refers to data that is thread-specific. 222555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 223555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \return The newly created thread local storage identifier, or 0 on error 224555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 225555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \code 226555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * static SDL_SpinLock tls_lock; 227555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * static SDL_TLSID thread_local_storage; 228555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 229555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * void SetMyThreadData(void *value) 230555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * { 231555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * if (!thread_local_storage) { 232555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * SDL_AtomicLock(&tls_lock); 233555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * if (!thread_local_storage) { 234555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * thread_local_storage = SDL_TLSCreate(); 235555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * } 236555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * SDL_AtomicUnLock(&tls_lock); 237555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * } 238555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * SDL_TLSSet(thread_local_storage, value); 239555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * } 240555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 241555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * void *GetMyThreadData(void) 242555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * { 243555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * return SDL_TLSGet(thread_local_storage); 244555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * } 245555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \endcode 246555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 247555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSGet() 248555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSSet() 249555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 250555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void); 251555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 252555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 253555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \brief Get the value associated with a thread local storage ID for the current thread. 254555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 255555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \param id The thread local storage ID 256555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 257555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \return The value associated with the ID for the current thread, or NULL if no value has been set. 258555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 259555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSCreate() 260555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSSet() 261555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 262555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); 263555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 264555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/** 265555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \brief Set the value associated with a thread local storage ID for the current thread. 266555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 267555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \param id The thread local storage ID 268555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \param value The value to associate with the ID for the current thread 269555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \param destructor A function called when the thread exits, to free the value. 270555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 271555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \return 0 on success, -1 on error 272555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * 273555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSCreate() 274555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot * \sa SDL_TLSGet() 275555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot */ 276555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotextern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (*destructor)(void*)); 277555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 278555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 279555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Ends C function definitions when using C++ */ 280555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifdef __cplusplus 281555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} 282555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif 283555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "close_code.h" 284555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 285555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif /* _SDL_thread_h */ 286555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 287555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* vi: set ts=4 sw=4 expandtab: */ 288