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