Mercurial > sdl-ios-xcode
annotate include/SDL_atomic.h @ 5097:dceec93471e7
Improvements based on feedback from Anthony Williams
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 25 Jan 2011 17:40:06 -0800 |
parents | c2539ff054c8 |
children | e4301cde4de1 |
rev | line source |
---|---|
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
1 /* |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
2 SDL - Simple DirectMedia Layer |
3697 | 3 Copyright (C) 1997-2010 Sam Lantinga |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
4 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
5 This library is free software; you can redistribute it and/or |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
7 License as published by the Free Software Foundation; either |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
9 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
10 This library is distributed in the hope that it will be useful, |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
13 Lesser General Public License for more details. |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
14 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
18 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
19 Sam Lantinga |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
20 slouken@libsdl.org |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
21 */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
22 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
23 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
24 * \file SDL_atomic.h |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
25 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
26 * Atomic operations. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
27 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
28 * IMPORTANT: |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
29 * If you are not an expert in concurrent lockless programming, you should |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
30 * only be using the atomic lock and reference counting functions in this |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
31 * file. In all other cases you should be protecting your data structures |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
32 * with full mutexes. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
33 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
34 * The list of "safe" functions to use are: |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
35 * SDL_AtomicLock() |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
36 * SDL_AtomicUnlock() |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
37 * SDL_AtomicIncRef() |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
38 * SDL_AtomicDecRef() |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
39 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
40 * Seriously, here be dragons! |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
41 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
42 * |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
43 * You can find out a little more about lockless programming and the |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
44 * subtle issues that can arise here: |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
45 * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
46 * |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
47 * These operations may or may not actually be implemented using |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
48 * processor specific atomic operations. When possible they are |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
49 * implemented as true processor specific atomic operations. When that |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
50 * is not possible the are implemented using locks that *do* use the |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
51 * available atomic operations. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
52 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
53 * All of the atomic operations that modify memory are full memory barriers. |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
54 */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
55 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
56 #ifndef _SDL_atomic_h_ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
57 #define _SDL_atomic_h_ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
58 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
59 #include "SDL_stdinc.h" |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
60 #include "SDL_platform.h" |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
61 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
62 #include "begin_code.h" |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
63 |
5073 | 64 /* Need to do this here because intrin.h has C++ code in it */ |
65 /* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ | |
5088
c2539ff054c8
Fixed compiling on Windows Mobile SDK 5.0 with Visual Studio 2008
Sam Lantinga <slouken@libsdl.org>
parents:
5073
diff
changeset
|
66 #if defined(_MSC_VER) && (_MSC_VER >= 1500) && !defined(_WIN32_WCE) |
5073 | 67 #include <intrin.h> |
68 #define HAVE_MSC_ATOMICS | |
69 #endif | |
70 | |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
71 /* Set up for C function definitions, even when using C++ */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
72 #ifdef __cplusplus |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
73 /* *INDENT-OFF* */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
74 extern "C" { |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
75 /* *INDENT-ON* */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
76 #endif |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
77 |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
78 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
79 * \name SDL AtomicLock |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
80 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
81 * The atomic locks are efficient spinlocks using CPU instructions, |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
82 * but are vulnerable to starvation and can spin forever if a thread |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
83 * holding a lock has been terminated. For this reason you should |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
84 * minimize the code executed inside an atomic lock and never do |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
85 * expensive things like API or system calls while holding them. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
86 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
87 * The atomic locks are not safe to lock recursively. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
88 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
89 * Porting Note: |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
90 * The spin lock functions and type are required and can not be |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
91 * emulated because they are used in the atomic emulation code. |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
92 */ |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
93 /*@{*/ |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
94 |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
95 typedef int SDL_SpinLock; |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
96 |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
97 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
98 * \brief Try to lock a spin lock by setting it to a non-zero value. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
99 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
100 * \param lock Points to the lock. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
101 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
102 * \return SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already held. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
103 */ |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
104 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
105 |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
106 /** |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
107 * \brief Lock a spin lock by setting it to a non-zero value. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
108 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
109 * \param lock Points to the lock. |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
110 */ |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
111 extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
112 |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
113 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
114 * \brief Unlock a spin lock by setting it to 0. Always returns immediately |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
115 * |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
116 * \param lock Points to the lock. |
3261
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
117 */ |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
118 extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); |
72b542f34739
The new, cleaner, version of the atomic operations. The dummy code is what you should start working with to port atomic ops.
Bob Pendleton <bob@pendleton.com>
parents:
3237
diff
changeset
|
119 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
120 /*@}*//*SDL AtomicLock*/ |
3202
3aa519a5c676
I've made so many changes I don't dare continue until I check the current stuff in.
Bob Pendleton <bob@pendleton.com>
parents:
3199
diff
changeset
|
121 |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
122 |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
123 /* The compiler barrier prevents the compiler from reordering |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
124 reads and writes to globally visible variables across the call. |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
125 */ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
126 #ifdef _MSC_VER |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
127 void _ReadWriteBarrier(void); |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
128 #pragma intrinsic(_ReadWriteBarrier) |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
129 #define SDL_CompilerBarrier() _ReadWriteBarrier() |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
130 #elif __GNUC__ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
131 #define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
132 #else |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
133 #define SDL_CompilerBarrier() \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
134 ({ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); }) |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
135 #endif |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
136 |
5006
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
137 /* Platform specific optimized versions of the atomic functions, |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
138 * you can disable these by defining SDL_DISABLE_ATOMIC_INLINE |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
139 */ |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
140 #ifndef SDL_DISABLE_ATOMIC_INLINE |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
141 |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
142 #if HAVE_MSC_ATOMICS |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
143 |
5016
cc879bc6c4cf
Fixed compiler warnings using Windows intrinsics
Sam Lantinga <slouken@libsdl.org>
parents:
5012
diff
changeset
|
144 #define SDL_AtomicSet(a, v) _InterlockedExchange((long*)&(a)->value, (v)) |
cc879bc6c4cf
Fixed compiler warnings using Windows intrinsics
Sam Lantinga <slouken@libsdl.org>
parents:
5012
diff
changeset
|
145 #define SDL_AtomicAdd(a, v) _InterlockedExchangeAdd((long*)&(a)->value, (v)) |
cc879bc6c4cf
Fixed compiler warnings using Windows intrinsics
Sam Lantinga <slouken@libsdl.org>
parents:
5012
diff
changeset
|
146 #define SDL_AtomicCAS(a, oldval, newval) (_InterlockedCompareExchange((long*)&(a)->value, (newval), (oldval)) == (oldval)) |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
147 #define SDL_AtomicSetPtr(a, v) _InterlockedExchangePointer((a), (v)) |
5012
2e282002bac3
Use compiler intrinsics, where available
Sam Lantinga <slouken@libsdl.org>
parents:
5006
diff
changeset
|
148 #if _M_IX86 |
2e282002bac3
Use compiler intrinsics, where available
Sam Lantinga <slouken@libsdl.org>
parents:
5006
diff
changeset
|
149 #define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchange((long*)(a), (long)(newval), (long)(oldval)) == (long)(oldval)) |
2e282002bac3
Use compiler intrinsics, where available
Sam Lantinga <slouken@libsdl.org>
parents:
5006
diff
changeset
|
150 #else |
2e282002bac3
Use compiler intrinsics, where available
Sam Lantinga <slouken@libsdl.org>
parents:
5006
diff
changeset
|
151 #define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchangePointer((a), (newval), (oldval)) == (oldval)) |
2e282002bac3
Use compiler intrinsics, where available
Sam Lantinga <slouken@libsdl.org>
parents:
5006
diff
changeset
|
152 #endif |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
153 |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
154 #elif __MACOSX__ |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
155 #include <libkern/OSAtomic.h> |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
156 |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
157 #define SDL_AtomicCAS(a, oldval, newval) OSAtomicCompareAndSwap32Barrier((oldval), (newval), &(a)->value) |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
158 #if SIZEOF_VOIDP == 4 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
159 #define SDL_AtomicCASPtr(a, oldval, newval) OSAtomicCompareAndSwap32Barrier((int32_t)(oldval), (int32_t)(newval), (int32_t*)(a)) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
160 #elif SIZEOF_VOIDP == 8 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
161 #define SDL_AtomicCASPtr(a, oldval, newval) OSAtomicCompareAndSwap64Barrier((int64_t)(oldval), (int64_t)(newval), (int64_t*)(a)) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
162 #endif |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
163 |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
164 #elif HAVE_GCC_ATOMICS |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
165 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
166 #define SDL_AtomicSet(a, v) __sync_lock_test_and_set(&(a)->value, v) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
167 #define SDL_AtomicAdd(a, v) __sync_fetch_and_add(&(a)->value, v) |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
168 #define SDL_AtomicSetPtr(a, v) __sync_lock_test_and_set(a, v) |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
169 #define SDL_AtomicCAS(a, oldval, newval) __sync_bool_compare_and_swap(&(a)->value, oldval, newval) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
170 #define SDL_AtomicCASPtr(a, oldval, newval) __sync_bool_compare_and_swap(a, oldval, newval) |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
171 |
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
172 #endif |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
173 |
5006
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
174 #endif /* !SDL_DISABLE_ATOMIC_INLINE */ |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
175 |
8e8876e4aec6
Include windows.h in SDL_atomic.h by default, but don't include the atomic API in SDL.h
Sam Lantinga <slouken@libsdl.org>
parents:
5005
diff
changeset
|
176 |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
177 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
178 * \brief A type representing an atomic integer value. It is a struct |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
179 * so people don't accidentally use numeric operations on it. |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
180 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
181 #ifndef SDL_atomic_t_defined |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
182 typedef struct { int value; } SDL_atomic_t; |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
183 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
184 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
185 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
186 * \brief Set an atomic variable to a value. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
187 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
188 * \return The previous value of the atomic variable. |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
189 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
190 #ifndef SDL_AtomicSet |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
191 #define SDL_AtomicSet(a, v) \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
192 ({ \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
193 int _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
194 do { \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
195 _value = (a)->value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
196 } while (!SDL_AtomicCAS(a, _value, (v))); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
197 _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
198 }) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
199 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
200 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
201 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
202 * \brief Get the value of an atomic variable |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
203 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
204 #ifndef SDL_AtomicGet |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
205 #define SDL_AtomicGet(a) \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
206 ({ \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
207 int _value = (a)->value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
208 SDL_CompilerBarrier(); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
209 _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
210 }) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
211 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
212 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
213 /** |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
214 * \brief Add to an atomic variable. |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
215 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
216 * \return The previous value of the atomic variable. |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
217 * |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
218 * \note This same style can be used for any number operation |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
219 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
220 #ifndef SDL_AtomicAdd |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
221 #define SDL_AtomicAdd(a, v) \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
222 ({ \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
223 int _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
224 do { \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
225 _value = (a)->value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
226 } while (!SDL_AtomicCAS(a, _value, (_value + (v)))); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
227 _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
228 }) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
229 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
230 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
231 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
232 * \brief Increment an atomic variable used as a reference count. |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
233 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
234 #ifndef SDL_AtomicIncRef |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
235 #define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
236 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
237 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
238 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
239 * \brief Decrement an atomic variable used as a reference count. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
240 * |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
241 * \return SDL_TRUE if the variable reached zero after decrementing, |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
242 * SDL_FALSE otherwise |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
243 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
244 #ifndef SDL_AtomicDecRef |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
245 #define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
246 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
247 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
248 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
249 * \brief Set an atomic variable to a new value if it is currently an old value. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
250 * |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
251 * \return SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
252 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
253 * \note If you don't know what this function is for, you shouldn't use it! |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
254 */ |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
255 #ifndef SDL_AtomicCAS |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
256 #define SDL_AtomicCAS SDL_AtomicCAS_ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
257 #endif |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
258 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS_(SDL_atomic_t *a, int oldval, int newval); |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
259 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
260 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
261 * \brief Set a pointer to a value atomically. |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
262 * |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
263 * \return The previous value of the pointer. |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
264 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
265 #ifndef SDL_AtomicSetPtr |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
266 #define SDL_AtomicSetPtr(a, v) \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
267 ({ \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
268 void* _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
269 do { \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
270 _value = *(a); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
271 } while (!SDL_AtomicCASPtr(a, _value, (v))); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
272 _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
273 }) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
274 #endif |
3237
916f396fe65d
Start of redesign, getting rid of 8 and 16 bit operations in .h and test files.
Bob Pendleton <bob@pendleton.com>
parents:
3216
diff
changeset
|
275 |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
276 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
277 * \brief Get the value of a pointer atomically. |
3199
3e1bf2b8bd81
This check in updates SDL_atomic.h to reflect the new set of atomic operations in 32 and 64 bit form.
Bob Pendleton <bob@pendleton.com>
parents:
3187
diff
changeset
|
278 */ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
279 #ifndef SDL_AtomicGetPtr |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
280 #define SDL_AtomicGetPtr(a) \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
281 ({ \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
282 void* _value = *(a); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
283 SDL_CompilerBarrier(); \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
284 _value; \ |
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
285 }) |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
286 #endif |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
287 |
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
288 /** |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
289 * \brief Set a pointer to a new value if it is currently an old value. |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
290 * |
5004
0c72ae7b7cb2
Added native atomic operations for Windows, Mac OS X, and gcc compiler intrinsics.
Sam Lantinga <slouken@libsdl.org>
parents:
5003
diff
changeset
|
291 * \return SDL_TRUE if the pointer was set, SDL_FALSE otherwise. |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
292 * |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
293 * \note If you don't know what this function is for, you shouldn't use it! |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
294 */ |
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
295 #ifndef SDL_AtomicCASPtr |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
296 #define SDL_AtomicCASPtr SDL_AtomicCASPtr_ |
5003
3a95a2b93eb3
Updated the atomic API for better use cases
Sam Lantinga <slouken@libsdl.org>
parents:
4474
diff
changeset
|
297 #endif |
5097
dceec93471e7
Improvements based on feedback from Anthony Williams
Sam Lantinga <slouken@libsdl.org>
parents:
5088
diff
changeset
|
298 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr_(void **a, void *oldval, void *newval); |
3407
d3baf5ac4e37
Partial fix for bug #859
Sam Lantinga <slouken@libsdl.org>
parents:
3261
diff
changeset
|
299 |
3180
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
300 /* Ends C function definitions when using C++ */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
301 #ifdef __cplusplus |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
302 /* *INDENT-OFF* */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
303 } |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
304 /* *INDENT-ON* */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
305 #endif |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
306 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
307 #include "close_code.h" |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
308 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
309 #endif /* _SDL_atomic_h_ */ |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
310 |
77d6336711fc
First commit for SDL atomic operations.
Bob Pendleton <bob@pendleton.com>
parents:
diff
changeset
|
311 /* vi: set ts=4 sw=4 expandtab: */ |