14#ifndef _OPENTHREADS_ATOMIC_
15#define _OPENTHREADS_ATOMIC_
17#include <OpenThreads/Config>
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)
31#elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX)
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;
221Atomic::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)
#define _OPENTHREADS_ATOMIC_INLINE
Definition Atomic:39
#define OPENTHREAD_EXPORT_DIRECTIVE
Definition Exports:20
This class provides an atomic increment and decrement operation.
Definition Atomic:48
Atomic(unsigned value=0)
Definition Atomic:50
_OPENTHREADS_ATOMIC_INLINE unsigned exchange(unsigned value=0)
Definition Atomic:200
_OPENTHREADS_ATOMIC_INLINE unsigned OR(unsigned value)
Definition Atomic:160
_OPENTHREADS_ATOMIC_INLINE unsigned operator--()
Definition Atomic:124
_OPENTHREADS_ATOMIC_INLINE unsigned operator++()
Definition Atomic:107
_OPENTHREADS_ATOMIC_INLINE unsigned XOR(unsigned value)
Definition Atomic:179
_OPENTHREADS_ATOMIC_INLINE unsigned AND(unsigned value)
Definition Atomic:141
This class provides an atomic pointer assignment using cas operations.
Definition Atomic:83
~AtomicPtr()
Definition Atomic:87
_OPENTHREADS_ATOMIC_INLINE void * get() const
Definition Atomic:264
AtomicPtr(void *ptr=0)
Definition Atomic:85
_OPENTHREADS_ATOMIC_INLINE bool assign(void *ptrNew, const void *const ptrOld)
Definition Atomic:241
This class provides an object-oriented thread mutex interface.
Definition Mutex:31