Mercurial > sdl-ios-xcode
annotate include/SDL_thread.h @ 5004:0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Changed the CAS return value to bool, so it's efficient with OSAtomicCompareAndSwap32Barrier()
Added an atomic test adapted from code by Michael Davidsaver
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 16 Jan 2011 15:16:39 -0800 |
parents | f42e8db53f78 |
children | e8916fe9cfc8 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
3697 | 3 Copyright (C) 1997-2010 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1190
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
251
b8688cfdc232
Updated the headers with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifndef _SDL_thread_h | |
24 #define _SDL_thread_h | |
25 | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
26 /** |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
27 * \file SDL_thread.h |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
28 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
29 * Header for the SDL thread management routines. |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
30 */ |
0 | 31 |
1356
67114343400d
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
1330
diff
changeset
|
32 #include "SDL_stdinc.h" |
1358
c71e05b4dc2e
More header massaging... works great on Windows. ;-)
Sam Lantinga <slouken@libsdl.org>
parents:
1356
diff
changeset
|
33 #include "SDL_error.h" |
0 | 34 |
35 /* Thread synchronization primitives */ | |
36 #include "SDL_mutex.h" | |
37 | |
38 #include "begin_code.h" | |
39 /* Set up for C function definitions, even when using C++ */ | |
40 #ifdef __cplusplus | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
41 /* *INDENT-OFF* */ |
0 | 42 extern "C" { |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
43 /* *INDENT-ON* */ |
0 | 44 #endif |
45 | |
46 /* The SDL thread structure, defined in SDL_thread.c */ | |
47 struct SDL_Thread; | |
48 typedef struct SDL_Thread SDL_Thread; | |
49 | |
3578 | 50 /* The SDL thread ID */ |
51 typedef unsigned long SDL_threadID; | |
52 | |
4866
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
53 /* The function passed to SDL_CreateThread() |
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
54 It is passed a void* user context parameter and returns an int. |
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
55 */ |
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
56 typedef int (SDLCALL * SDL_ThreadFunction) (void *data); |
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
57 |
3269
a67a961e2171
Removed outdated OS/2 support
Sam Lantinga <slouken@libsdl.org>
parents:
2859
diff
changeset
|
58 #if defined(__WIN32__) && !defined(HAVE_LIBC) |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
59 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
60 * \file SDL_thread.h |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
61 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
62 * We compile SDL into a DLL. This means, that it's the DLL which |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
63 * creates a new thread for the calling process with the SDL_CreateThread() |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
64 * API. There is a problem with this, that only the RTL of the SDL.DLL will |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
65 * be initialized for those threads, and not the RTL of the calling |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
66 * application! |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
67 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
68 * To solve this, we make a little hack here. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
69 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
70 * We'll always use the caller's _beginthread() and _endthread() APIs to |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
71 * start a new thread. This way, if it's the SDL.DLL which uses this API, |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
72 * then the RTL of SDL.DLL will be used to create the new thread, and if it's |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
73 * the application, then the RTL of the application will be used. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
74 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
75 * So, in short: |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
76 * Always use the _beginthread() and _endthread() of the calling runtime |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
77 * library! |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
78 */ |
1471
9fb0eee04dd9
Enabled libc support on Win32, so we don't break binary compatibility in 1.2
Sam Lantinga <slouken@libsdl.org>
parents:
1470
diff
changeset
|
79 #define SDL_PASSED_BEGINTHREAD_ENDTHREAD |
1465
8dfa9a6d69a5
Updated WinCE support by Dmitry (with some tweaks)
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
80 #ifndef _WIN32_WCE |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
81 #include <process.h> /* This has _beginthread() and _endthread() defined! */ |
1190 | 82 #endif |
83 | |
3269
a67a961e2171
Removed outdated OS/2 support
Sam Lantinga <slouken@libsdl.org>
parents:
2859
diff
changeset
|
84 #ifdef __GNUC__ |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
85 typedef unsigned long (__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
86 unsigned |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
87 (__stdcall * |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
88 func) (void *), |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
89 void *arg, |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
90 unsigned, |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
91 unsigned |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
92 *threadID); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
93 typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
94 #else |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
95 typedef uintptr_t(__cdecl * pfnSDL_CurrentBeginThread) (void *, unsigned, |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
96 unsigned (__stdcall * |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
97 func) (void |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
98 *), |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
99 void *arg, unsigned, |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
100 unsigned *threadID); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
101 typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
102 #endif |
1190 | 103 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
104 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
105 * Create a thread. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
106 */ |
2060 | 107 extern DECLSPEC SDL_Thread *SDLCALL |
4866
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
108 SDL_CreateThread(SDL_ThreadFunction fn, void *data, |
2060 | 109 pfnSDL_CurrentBeginThread pfnBeginThread, |
110 pfnSDL_CurrentEndThread pfnEndThread); | |
1190 | 111 |
3269
a67a961e2171
Removed outdated OS/2 support
Sam Lantinga <slouken@libsdl.org>
parents:
2859
diff
changeset
|
112 #if defined(_WIN32_WCE) |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
113 |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
114 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
115 * Create a thread. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
116 */ |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
117 #define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, NULL, NULL) |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
118 |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
119 #else |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
120 |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
121 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
122 * Create a thread. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
123 */ |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
124 #define SDL_CreateThread(fn, data) SDL_CreateThread(fn, data, _beginthreadex, _endthreadex) |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
125 |
1330
450721ad5436
It's now possible to build SDL without any C runtime at all on Windows,
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
126 #endif |
1190 | 127 #else |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
128 |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
129 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
130 * Create a thread. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
131 */ |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
132 extern DECLSPEC SDL_Thread *SDLCALL |
4866
f42e8db53f78
Added a typedef for the thread function to simplify documentation
Sam Lantinga <slouken@libsdl.org>
parents:
4468
diff
changeset
|
133 SDL_CreateThread(SDL_ThreadFunction fn, void *data); |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
134 |
1190 | 135 #endif |
0 | 136 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
137 /** |
3578 | 138 * Get the thread identifier for the current thread. |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
139 */ |
3578 | 140 extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); |
0 | 141 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
142 /** |
3578 | 143 * Get the thread identifier for the specified thread. |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
144 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
145 * Equivalent to SDL_ThreadID() if the specified thread is NULL. |
0 | 146 */ |
3578 | 147 extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); |
0 | 148 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
149 /** |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
150 * Wait for a thread to finish. |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
151 * |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
152 * The return code for the thread function is placed in the area |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3269
diff
changeset
|
153 * pointed to by \c status, if \c status is not NULL. |
0 | 154 */ |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
155 extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); |
0 | 156 |
157 | |
158 /* Ends C function definitions when using C++ */ | |
159 #ifdef __cplusplus | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
160 /* *INDENT-OFF* */ |
0 | 161 } |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
162 /* *INDENT-ON* */ |
0 | 163 #endif |
164 #include "close_code.h" | |
165 | |
166 #endif /* _SDL_thread_h */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
167 |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1850
diff
changeset
|
168 /* vi: set ts=4 sw=4 expandtab: */ |