14 #ifndef _OPENTHREADS_ATOMIC_
15 #define _OPENTHREADS_ATOMIC_
17 #include <OpenThreads/Config>
18 #include <OpenThreads/Exports>
20 #if defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
21 # include <libkern/OSAtomic.h>
22 # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
23 #elif defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) && defined(__i386__)
24 # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
25 #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
26 # define _OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES
27 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
30 # include "ScopedLock"
31 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
33 # include "ScopedLock"
36 #if defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES)
37 #define _OPENTHREADS_ATOMIC_INLINE
39 #define _OPENTHREADS_ATOMIC_INLINE inline
50 Atomic(
unsigned value = 0) : _value(value)
64 #if defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
67 #if defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED)
69 #elif defined(_OPENTHREADS_ATOMIC_USE_BSD_ATOMIC)
70 volatile int32_t _value;
71 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
72 volatile uint_t _value;
75 volatile unsigned _value;
98 #if defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
104 #if !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES)
109 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
110 return __sync_add_and_fetch(&_value, 1);
111 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
112 return __add_and_fetch(&_value, 1);
113 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
114 return atomic_inc_uint_nv(&_value);
115 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
126 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
127 return __sync_sub_and_fetch(&_value, 1);
128 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
129 return __sub_and_fetch(&_value, 1);
130 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
131 return atomic_dec_uint_nv(&_value);
132 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
143 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
144 return __sync_fetch_and_and(&_value, value);
145 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
146 return __and_and_fetch(&_value, value);
147 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
148 return atomic_and_uint_nv(&_value, value);
149 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
162 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
163 return __sync_fetch_and_or(&_value, value);
164 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
165 return __or_and_fetch(&_value, value);
166 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
167 return atomic_or_uint_nv(&_value, value);
168 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
181 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
182 return __sync_fetch_and_xor(&_value, value);
183 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
184 return __xor_and_fetch(&_value, value);
185 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
189 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
202 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
203 return __sync_lock_test_and_set(&_value, value);
204 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
205 return __compare_and_swap(&_value, _value, value);
206 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
207 return atomic_cas_uint(&_value, _value, value);
208 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
210 unsigned oldval = _value;
214 unsigned oldval = _value;
221 Atomic::operator unsigned()
const
223 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
224 __sync_synchronize();
226 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
229 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
232 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
243 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
244 return __sync_bool_compare_and_swap(&_ptr, (
void *)ptrOld, ptrNew);
245 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
246 return __compare_and_swap((
unsigned long*)&_ptr, (
unsigned long)ptrOld, (
unsigned long)ptrNew);
247 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
248 return ptrOld == atomic_cas_ptr(&_ptr, const_cast<void*>(ptrOld), ptrNew);
249 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
266 #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS)
267 __sync_synchronize();
269 #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS)
272 #elif defined(_OPENTHREADS_ATOMIC_USE_SUN)
275 #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
283 #endif // !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES)
287 #endif // _OPENTHREADS_ATOMIC_
This class provides an object-oriented thread mutex interface.
_OPENTHREADS_ATOMIC_INLINE bool assign(void *ptrNew, const void *const ptrOld)
_OPENTHREADS_ATOMIC_INLINE unsigned operator++()
#define _OPENTHREADS_ATOMIC_INLINE
This class provides an atomic increment and decrement operation.
_OPENTHREADS_ATOMIC_INLINE unsigned operator--()
_OPENTHREADS_ATOMIC_INLINE void * get() const
This class provides an atomic pointer assignment using cas operations.
#define OPENTHREAD_EXPORT_DIRECTIVE
_OPENTHREADS_ATOMIC_INLINE unsigned OR(unsigned value)
_OPENTHREADS_ATOMIC_INLINE unsigned exchange(unsigned value=0)
_OPENTHREADS_ATOMIC_INLINE unsigned XOR(unsigned value)
_OPENTHREADS_ATOMIC_INLINE unsigned AND(unsigned value)