39 #ifndef __vtkAtomicInt_h
40 #define __vtkAtomicInt_h
46 #if defined(__APPLE__)
47 # include <libkern/OSAtomic.h>
50 #if (defined(_WIN32) && !defined(__MINGW32__))
51 # define VTK_WINDOWS_ATOMIC
52 # if defined(_MSC_VER)
53 # pragma warning(disable:4324) // disable warning about the padding due to alignment
57 #if defined(VTK_WINDOWS_ATOMIC) || defined(__APPLE__) || defined(VTK_HAVE_SYNC_BUILTINS)
58 # define VTK_HAS_ATOMIC32
63 #if VTK_SIZEOF_VOID_P == 8
64 # if defined(VTK_WINDOWS_ATOMIC) || defined(__APPLE__) || defined(VTK_HAVE_SYNC_BUILTINS)
65 # define VTK_HAS_ATOMIC64
69 #if !defined(VTK_HAS_ATOMIC64) || !defined(VTK_HAS_ATOMIC32)
76 #if defined (VTK_WINDOWS_ATOMIC)
77 # define VTK__ALIGN32 __declspec(align(32))
85 #if defined(VTK_HAS_ATOMIC32) && !defined(VTK_WINDOWS_ATOMIC)
95 #if defined(VTK_HAS_ATOMIC32) && !defined(VTK_WINDOWS_ATOMIC)
98 # if defined(__APPLE__)
99 return OSAtomicIncrement32Barrier(&this->Value);
103 # elif defined(VTK_HAVE_SYNC_BUILTINS)
104 return __sync_add_and_fetch(&this->Value, 1);
113 # if defined(__APPLE__)
114 return OSAtomicDecrement32Barrier(&this->Value);
118 # elif defined(VTK_HAVE_SYNC_BUILTINS)
119 return __sync_sub_and_fetch(&this->Value, 1);
128 # if defined(__APPLE__)
129 return OSAtomicAdd32Barrier(val, &this->Value);
133 # elif defined(VTK_HAVE_SYNC_BUILTINS)
134 return __sync_add_and_fetch(&this->Value, val);
143 # if defined(__APPLE__)
144 vtkTypeInt32 retval = 0;
145 OSAtomicCompareAndSwap32Barrier(retval, this->Value, &retval);
150 # elif defined(VTK_HAVE_SYNC_BUILTINS)
151 vtkTypeInt32 retval = 0;
152 __sync_val_compare_and_swap(&retval, retval, this->Value);
162 # if defined(__APPLE__)
163 OSAtomicCompareAndSwap32Barrier(this->Value, val, &this->Value);
167 # elif defined(VTK_HAVE_SYNC_BUILTINS)
168 __sync_val_compare_and_swap(&this->Value, this->Value, val);
173 #else // defined(VTK_HAS_ATOMIC32) && !defined(VTK_WINDOWS_ATOMIC)
180 vtkTypeInt32 operator++();
181 vtkTypeInt32 operator--();
182 vtkTypeInt32 operator+=(vtkTypeInt32
val);
183 vtkTypeInt32
load()
const;
184 void store(vtkTypeInt32
val);
186 #endif // defined(VTK_HAS_ATOMIC32) && !defined(VTK_WINDOWS_ATOMIC)
194 #if !defined(VTK_HAS_ATOMIC32)
199 #if defined (VTK_WINDOWS_ATOMIC)
200 # define VTK__ALIGN64 __declspec(align(64))
202 # define VTK__ALIGN64
206 #if defined(VTK_HAS_ATOMIC64) && !defined(VTK_WINDOWS_ATOMIC)
216 #if defined(VTK_HAS_ATOMIC64) && !defined(VTK_WINDOWS_ATOMIC)
219 # if defined(__APPLE__)
220 return OSAtomicIncrement64Barrier(&this->Value);
224 # elif defined(VTK_HAVE_SYNC_BUILTINS)
225 return __sync_add_and_fetch(&this->Value, 1);
234 # if defined(__APPLE__)
235 return OSAtomicDecrement64Barrier(&this->Value);
239 # elif defined(VTK_HAVE_SYNC_BUILTINS)
240 return __sync_sub_and_fetch(&this->Value, 1);
249 # if defined(__APPLE__)
250 return OSAtomicAdd64Barrier(val, &this->Value);
254 # elif defined(VTK_HAVE_SYNC_BUILTINS)
255 return __sync_add_and_fetch(&this->Value, val);
264 # if defined(__APPLE__)
265 vtkTypeInt64 retval = 0;
266 OSAtomicCompareAndSwap64Barrier(retval, this->Value, &retval);
271 # elif defined(VTK_HAVE_SYNC_BUILTINS)
272 vtkTypeInt64 retval = 0;
273 __sync_val_compare_and_swap(&retval, retval, this->Value);
283 # if defined(__APPLE__)
284 OSAtomicCompareAndSwap64Barrier(this->Value, val, &this->Value);
288 # elif defined(VTK_HAVE_SYNC_BUILTINS)
289 __sync_val_compare_and_swap(&this->Value, this->Value, val);
294 #else // defined(VTK_HAS_ATOMIC64) && !defined(VTK_WINDOWS_ATOMIC)
301 vtkTypeInt64 operator++();
302 vtkTypeInt64 operator--();
303 vtkTypeInt64 operator+=(vtkTypeInt64
val);
304 vtkTypeInt64
load()
const;
305 void store(vtkTypeInt64
val);
307 #endif // defined(VTK_HAS_ATOMIC64) && !defined(VTK_WINDOWS_ATOMIC)
315 #if !defined(VTK_HAS_ATOMIC64)
321 template <
typename T>
347 return this->Superclass::operator++();
363 return this->Superclass::operator--();
379 return this->operator+=(-val);
vtkTypeInt64 load() const
vtkTypeInt32 load() const
#define VTKCOMMONCORE_EXPORT
vtkTypeInt64 operator+=(vtkTypeInt64 val)
vtkTypeInt64 operator--()
void store(vtkTypeInt32 val)
vtkTypeInt32 operator+=(vtkTypeInt32 val)
VTK__ALIGN64 vtkTypeInt64 Value
Critical section locking class.
void store(vtkTypeInt64 val)
vtkTypeInt64 operator++()
VTK__ALIGN32 vtkTypeInt32 Value
vtkTypeInt32 operator--()
Provides support for atomic integers.
vtkTypeInt32 operator++()