comparison include/SDL_atomic.h @ 3407:d3baf5ac4e37

Partial fix for bug #859 Header file update from Ken for improved doxygen output
author Sam Lantinga <slouken@libsdl.org>
date Mon, 19 Oct 2009 13:31:58 +0000
parents 72b542f34739
children f7b03b6838cb
comparison
equal deleted inserted replaced
3406:8ae607392409 3407:d3baf5ac4e37
21 21
22 Contributed by Bob Pendleton, bob@pendleton.com 22 Contributed by Bob Pendleton, bob@pendleton.com
23 */ 23 */
24 24
25 /** 25 /**
26 * \file SDL_atomic.h 26 * \file SDL_atomic.h
27 * 27 *
28 * Atomic operations. 28 * Atomic operations.
29 *
30 * These operations may, or may not, actually be implemented using
31 * processor specific atomic operations. When possible they are
32 * implemented as true processor specific atomic operations. When that
33 * is not possible the are implemented using locks that *do* use the
34 * available atomic operations.
35 *
36 * At the very minimum spin locks must be implemented. Without spin
37 * locks it is not possible (AFAICT) to emulate the rest of the atomic
38 * operations.
29 */ 39 */
30 40
31 #ifndef _SDL_atomic_h_ 41 #ifndef _SDL_atomic_h_
32 #define _SDL_atomic_h_ 42 #define _SDL_atomic_h_
33 43
41 /* *INDENT-OFF* */ 51 /* *INDENT-OFF* */
42 extern "C" { 52 extern "C" {
43 /* *INDENT-ON* */ 53 /* *INDENT-ON* */
44 #endif 54 #endif
45 55
46 /** 56 /* Function prototypes */
47 * These operations may, or may not, actually be implemented using 57
48 * processor specific atomic operations. When possible they are 58 /**
49 * implemented as true processor specific atomic operations. When that 59 * \name SDL AtomicLock
50 * is not possible the are implemented using locks that *do* use the 60 *
51 * available atomic operations. 61 * The spin lock functions and type are required and can not be
62 * emulated because they are used in the emulation code.
63 */
64 /*@{*/
65
66 typedef volatile Uint32 SDL_SpinLock;
67
68 /**
69 * \brief Lock a spin lock by setting it to a none zero value.
70 *
71 * \param lock Points to the lock.
72 */
73 extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock);
74
75 /**
76 * \brief Unlock a spin lock by setting it to 0. Always returns immediately
52 * 77 *
53 * At the very minimum spin locks must be implemented. Without spin 78 * \param lock Points to the lock.
54 * locks it is not possible (AFAICT) to emulate the rest of the atomic
55 * operations.
56 */
57
58 /* Function prototypes */
59
60 /**
61 * SDL AtomicLock.
62 *
63 * The spin lock functions and type are required and can not be
64 * emulated because they are used in the emulation code.
65 */
66
67 typedef volatile Uint32 SDL_SpinLock;
68
69 /**
70 * \fn void SDL_AtomicLock(SDL_SpinLock *lock);
71 *
72 * \brief Lock a spin lock by setting it to a none zero value.
73 *
74 * \param lock points to the lock.
75 *
76 */
77 extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock);
78
79 /**
80 * \fn void SDL_AtomicUnlock(SDL_SpinLock *lock);
81 *
82 * \brief Unlock a spin lock by setting it to 0. Always returns immediately
83 *
84 * \param lock points to the lock.
85 *
86 */ 79 */
87 extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); 80 extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);
88 81
89 /* 32 bit atomic operations */ 82 /*@}*//*SDL AtomicLock*/
90 83
91 /** 84 /**
92 * \fn SDL_bool SDL_AtomicTestThenSet32(volatile Uint32 * ptr); 85 * \name 32 bit atomic operations
93 * 86 */
94 * \brief Check to see if *ptr == 0 and set it to 1. 87 /*@{*/
95 * 88
96 * \return SDL_True if the value pointed to by ptr was zero and 89 /**
97 * SDL_False if it was not zero 90 * \brief Check to see if \c *ptr == 0 and set it to 1.
98 * 91 *
99 * \param ptr points to the value to be tested and set. 92 * \return SDL_True if the value pointed to by \c ptr was zero and
100 * 93 * SDL_False if it was not zero
94 *
95 * \param ptr Points to the value to be tested and set.
101 */ 96 */
102 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTestThenSet32(volatile Uint32 * ptr); 97 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTestThenSet32(volatile Uint32 * ptr);
103 98
104 /** 99 /**
105 * \fn void SDL_AtomicClear32(volatile Uint32 * ptr); 100 * \brief Set the value pointed to by \c ptr to be zero.
106 * 101 *
107 * \brief set the value pointed to by ptr to be zero. 102 * \param ptr Address of the value to be set to zero
108 *
109 * \param ptr address of the value to be set to zero
110 *
111 */ 103 */
112 extern DECLSPEC void SDLCALL SDL_AtomicClear32(volatile Uint32 * ptr); 104 extern DECLSPEC void SDLCALL SDL_AtomicClear32(volatile Uint32 * ptr);
113 105
114 /** 106 /**
115 * \fn Uint32 SDL_AtomicFetchThenIncrement32(volatile Uint32 * ptr); 107 * \brief Fetch the current value of \c *ptr and then increment that
116 * 108 * value in place.
117 * \brief fetch the current value of *ptr and then increment that 109 *
118 * value in place. 110 * \return The value before it was incremented.
119 * 111 *
120 * \return the value before it was incremented. 112 * \param ptr Address of the value to fetch and increment
121 *
122 * \param ptr address of the value to fetch and increment
123 *
124 */ 113 */
125 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenIncrement32(volatile Uint32 * ptr); 114 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenIncrement32(volatile Uint32 * ptr);
126 115
127 /** 116 /**
128 * \fn Uint32 SDL_AtomicFetchThenDecrement32(volatile Uint32 * ptr); 117 * \brief Fetch \c *ptr and then decrement the value in place.
129 * 118 *
130 * \brief fetch *ptr and then decrement the value in place. 119 * \return The value before it was decremented.
131 * 120 *
132 * \return the value before it was decremented. 121 * \param ptr Address of the value to fetch and drement
133 *
134 * \param ptr address of the value to fetch and drement
135 *
136 */ 122 */
137 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenDecrement32(volatile Uint32 * ptr); 123 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenDecrement32(volatile Uint32 * ptr);
138 124
139 /** 125 /**
140 * \fn Uint32 SDL_AtomicFetchThenAdd32(volatile Uint32 * ptr, Uint32 value); 126 * \brief Fetch the current value at \c ptr and then add \c value to \c *ptr.
141 * 127 *
142 * \brief fetch the current value at ptr and then add value to *ptr. 128 * \return \c *ptr before the addition took place.
143 * 129 *
144 * \return *ptr before the addition took place. 130 * \param ptr The address of data we are changing.
145 * 131 * \param value The value to add to \c *ptr.
146 * \param ptr the address of data we are changing.
147 * \param value the value to add to *ptr.
148 *
149 */ 132 */
150 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenAdd32(volatile Uint32 * ptr, Uint32 value); 133 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenAdd32(volatile Uint32 * ptr, Uint32 value);
151 134
152 /** 135 /**
153 * \fn Uint32 SDL_AtomicFetchThenSubtract32(volatile Uint32 * ptr, Uint32 value); 136 * \brief Fetch \c *ptr and then subtract \c value from it.
154 * 137 *
155 * \brief Fetch *ptr and then subtract value from it. 138 * \return \c *ptr before the subtraction took place.
156 * 139 *
157 * \return *ptr before the subtraction took place. 140 * \param ptr The address of the data being changed.
158 * 141 * \param value The value to subtract from \c *ptr.
159 * \param ptr the address of the data being changed.
160 * \param value the value to subtract from *ptr.
161 *
162 */ 142 */
163 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenSubtract32(volatile Uint32 * ptr, Uint32 value); 143 extern DECLSPEC Uint32 SDLCALL SDL_AtomicFetchThenSubtract32(volatile Uint32 * ptr, Uint32 value);
164 144
165 /** 145 /**
166 * \fn Uint32 SDL_AtomicIncrementThenFetch32(volatile Uint32 * ptr); 146 * \brief Add one to the data pointed to by \c ptr and return that value.
167 * 147 *
168 * \brief Add one to the data pointed to by ptr and return that value. 148 * \return The incremented value.
169 * 149 *
170 * \return the incremented value. 150 * \param ptr The address of the data to increment.
171 *
172 * \param ptr address of the data to increment.
173 *
174 */ 151 */
175 extern DECLSPEC Uint32 SDLCALL SDL_AtomicIncrementThenFetch32(volatile Uint32 * ptr); 152 extern DECLSPEC Uint32 SDLCALL SDL_AtomicIncrementThenFetch32(volatile Uint32 * ptr);
176 153
177 /** 154 /**
178 * \fn Uint32 SDL_AtomicDecrementThenFetch32(volatile Uint32 * ptr); 155 * \brief Subtract one from data pointed to by \c ptr and return the new value.
179 * 156 *
180 * \brief Subtract one from data pointed to by ptr and return the new value. 157 * \return The decremented value.
181 * 158 *
182 * \return The decremented value. 159 * \param ptr The address of the data to decrement.
183 *
184 * \param ptr The address of the data to decrement.
185 *
186 */ 160 */
187 extern DECLSPEC Uint32 SDLCALL SDL_AtomicDecrementThenFetch32(volatile Uint32 * ptr); 161 extern DECLSPEC Uint32 SDLCALL SDL_AtomicDecrementThenFetch32(volatile Uint32 * ptr);
188 162
189 /** 163 /**
190 * \fn Uint32 SDL_AtomicAddThenFetch32(volatile Uint32 * ptr, Uint32 value); 164 * \brief Add \c value to the data pointed to by \c ptr and return result.
191 * 165 *
192 * \brief Add value to the data pointed to by ptr and return result. 166 * \return The sum of \c *ptr and \c value.
193 * 167 *
194 * \return The sum of *ptr and value. 168 * \param ptr The address of the data to be modified.
195 * 169 * \param value The value to be added.
196 * \param ptr The address of the data to be modified.
197 * \param value The value to be added.
198 *
199 */ 170 */
200 extern DECLSPEC Uint32 SDLCALL SDL_AtomicAddThenFetch32(volatile Uint32 * ptr, Uint32 value); 171 extern DECLSPEC Uint32 SDLCALL SDL_AtomicAddThenFetch32(volatile Uint32 * ptr, Uint32 value);
201 172
202 /** 173 /**
203 * \fn Uint32 SDL_AtomicSubtractThenFetch32(volatile Uint32 * ptr, Uint32 value); 174 * \brief Subtract \c value from the data pointed to by \c ptr and return the result.
204 * 175 *
205 * \brief Subtract value from the data pointed to by ptr and return the result. 176 * \return The difference between \c *ptr and \c value.
206 * 177 *
207 * \return the difference between *ptr and value. 178 * \param ptr The address of the data to be modified.
208 * 179 * \param value The value to be subtracted.
209 * \param ptr The address of the data to be modified.
210 * \param value The value to be subtracted.
211 *
212 */ 180 */
213 extern DECLSPEC Uint32 SDLCALL SDL_AtomicSubtractThenFetch32(volatile Uint32 * ptr, Uint32 value); 181 extern DECLSPEC Uint32 SDLCALL SDL_AtomicSubtractThenFetch32(volatile Uint32 * ptr, Uint32 value);
214 182
215 /* 64 bit atomic operations */ 183 /*@}*//*32 bit atomic operations*/
184
185 /**
186 * \name 64 bit atomic operations
187 */
188 /*@{*/
216 #ifdef SDL_HAS_64BIT_TYPE 189 #ifdef SDL_HAS_64BIT_TYPE
217 190
218 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTestThenSet64(volatile Uint64 * ptr); 191 extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTestThenSet64(volatile Uint64 * ptr);
219 extern DECLSPEC void SDLCALL SDL_AtomicClear64(volatile Uint64 * ptr); 192 extern DECLSPEC void SDLCALL SDL_AtomicClear64(volatile Uint64 * ptr);
220 extern DECLSPEC Uint64 SDLCALL SDL_AtomicFetchThenIncrement64(volatile Uint64 * ptr); 193 extern DECLSPEC Uint64 SDLCALL SDL_AtomicFetchThenIncrement64(volatile Uint64 * ptr);
225 extern DECLSPEC Uint64 SDLCALL SDL_AtomicDecrementThenFetch64(volatile Uint64 * ptr); 198 extern DECLSPEC Uint64 SDLCALL SDL_AtomicDecrementThenFetch64(volatile Uint64 * ptr);
226 extern DECLSPEC Uint64 SDLCALL SDL_AtomicAddThenFetch64(volatile Uint64 * ptr, Uint64 value); 199 extern DECLSPEC Uint64 SDLCALL SDL_AtomicAddThenFetch64(volatile Uint64 * ptr, Uint64 value);
227 extern DECLSPEC Uint64 SDLCALL SDL_AtomicSubtractThenFetch64(volatile Uint64 * ptr, Uint64 value); 200 extern DECLSPEC Uint64 SDLCALL SDL_AtomicSubtractThenFetch64(volatile Uint64 * ptr, Uint64 value);
228 #endif /* SDL_HAS_64BIT_TYPE */ 201 #endif /* SDL_HAS_64BIT_TYPE */
229 202
203 /*@}*//*64 bit atomic operations*/
204
230 /* Ends C function definitions when using C++ */ 205 /* Ends C function definitions when using C++ */
231 #ifdef __cplusplus 206 #ifdef __cplusplus
232 /* *INDENT-OFF* */ 207 /* *INDENT-OFF* */
233 } 208 }
234 /* *INDENT-ON* */ 209 /* *INDENT-ON* */