12 #ifndef __LIDAR_ATOMIC_H__
13 #define __LIDAR_ATOMIC_H__
20 #elif defined __APPLE__
21 #include <libkern/OSAtomic.h>
22 #elif defined __GNUG__
23 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
24 #include <bits/atomicity.h>
27 #error unknown platform
30 LT_BEGIN_LIDAR_NAMESPACE
34 typedef LONG AtomicInt;
36 inline AtomicInt AtomicIncrement(AtomicInt &value)
38 return ::InterlockedIncrement(&value);
41 inline AtomicInt AtomicDecrement(AtomicInt &value)
43 return ::InterlockedDecrement(&value);
46 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
48 return InterlockedCompareExchangePointer(reinterpret_cast<void **>(&value), newValue, oldValue) == oldValue;
51 #elif defined __APPLE__
53 typedef int32_t AtomicInt;
55 inline AtomicInt AtomicIncrement(AtomicInt &value)
57 return OSAtomicIncrement32Barrier(&value);
60 inline AtomicInt AtomicDecrement(AtomicInt &value)
62 return OSAtomicDecrement32Barrier(&value);
65 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
67 return ::OSAtomicCompareAndSwapPtrBarrier(oldValue, newValue, reinterpret_cast<void **>(&value));
71 #elif defined __GNUG__
73 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
74 typedef _Atomic_word AtomicInt;
76 typedef int AtomicInt;
79 inline AtomicInt AtomicIncrement(AtomicInt &value)
81 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
82 return __exchange_and_add(&value, 1) + 1;
83 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
84 return __gnu_cxx::__exchange_and_add(&value, 1) + 1;
86 return __sync_add_and_fetch(&value, 1);
90 inline AtomicInt AtomicDecrement(AtomicInt &value)
92 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
93 return __exchange_and_add(&value, -1) - 1;
94 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
95 return __gnu_cxx::__exchange_and_add(&value, -1) - 1;
97 return __sync_sub_and_fetch(&value, 1);
101 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
103 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
105 if(value == oldValue)
113 return __sync_bool_compare_and_swap(&value, oldValue, newValue);
121 LT_END_LIDAR_NAMESPACE
122 #endif // __LIDAR_ATOMIC_H__