12 #ifndef __LIDAR_ATOMIC_H__
13 #define __LIDAR_ATOMIC_H__
20 #elif defined __GNUG__
21 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
22 #include <bits/atomicity.h>
25 #error unknown platform
28 LT_BEGIN_LIDAR_NAMESPACE
32 typedef LONG AtomicInt;
34 inline AtomicInt AtomicIncrement(AtomicInt &value)
36 return ::InterlockedIncrement(&value);
39 inline AtomicInt AtomicDecrement(AtomicInt &value)
41 return ::InterlockedDecrement(&value);
44 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
46 return InterlockedCompareExchangePointer(reinterpret_cast<void **>(&value), newValue, oldValue) == oldValue;
49 #elif defined __GNUG__
51 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
52 typedef _Atomic_word AtomicInt;
54 typedef int AtomicInt;
57 inline AtomicInt AtomicIncrement(AtomicInt &value)
59 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
60 return __exchange_and_add(&value, 1) + 1;
61 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
62 return __gnu_cxx::__exchange_and_add(&value, 1) + 1;
64 return __sync_add_and_fetch(&value, 1);
68 inline AtomicInt AtomicDecrement(AtomicInt &value)
70 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
71 return __exchange_and_add(&value, -1) - 1;
72 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
73 return __gnu_cxx::__exchange_and_add(&value, -1) - 1;
75 return __sync_sub_and_fetch(&value, 1);
79 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
81 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
91 return __sync_bool_compare_and_swap(&value, oldValue, newValue);
99 LT_END_LIDAR_NAMESPACE
100 #endif // __LIDAR_ATOMIC_H__