00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012 #ifndef __LIDAR_ATOMIC_H__
00013 #define __LIDAR_ATOMIC_H__
00014
00015 #include "lidar/Base.h"
00016
00017 #if defined _WIN32
00018 #define NOMINMAX
00019 #include <windows.h>
00020 #elif defined __APPLE__
00021 #include <libkern/OSAtomic.h>
00022 #elif defined __GNUG__
00023 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
00024 #include <bits/atomicity.h>
00025 #endif
00026 #else
00027 #error unknown platform
00028 #endif
00029
00030 LT_BEGIN_LIDAR_NAMESPACE
00031
00032 #if defined _WIN32
00033
00034 typedef LONG AtomicInt;
00035
00036 inline AtomicInt AtomicIncrement(AtomicInt &value)
00037 {
00038 return ::InterlockedIncrement(&value);
00039 }
00040
00041 inline AtomicInt AtomicDecrement(AtomicInt &value)
00042 {
00043 return ::InterlockedDecrement(&value);
00044 }
00045
00046 #elif defined __APPLE__
00047
00048 typedef int32_t AtomicInt;
00049
00050 inline AtomicInt AtomicIncrement(AtomicInt &value)
00051 {
00052 return OSAtomicIncrement32Barrier(&value);
00053 }
00054
00055 inline AtomicInt AtomicDecrement(AtomicInt &value)
00056 {
00057 return OSAtomicDecrement32Barrier(&value);
00058 }
00059
00060 #elif defined __GNUG__
00061
00062 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42
00063 typedef _Atomic_word AtomicInt;
00064 #else
00065 typedef int AtomicInt;
00066 #endif
00067
00068 inline AtomicInt AtomicIncrement(AtomicInt &value)
00069 {
00070 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
00071 return __exchange_and_add(&value, 1) + 1;
00072 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
00073 return __gnu_cxx::__exchange_and_add(&value, 1) + 1;
00074 #else
00075 return __sync_add_and_fetch(&value, 1);
00076 #endif
00077 }
00078
00079 inline AtomicInt AtomicDecrement(AtomicInt &value)
00080 {
00081 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34
00082 return __exchange_and_add(&value, -1) - 1;
00083 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42
00084 return __gnu_cxx::__exchange_and_add(&value, -1) - 1;
00085 #else
00086 return __sync_sub_and_fetch(&value, 1);
00087 #endif
00088 }
00089
00090 #else
00091 #error
00092 #endif
00093
00094 LT_END_LIDAR_NAMESPACE
00095 #endif // __LIDAR_ATOMIC_H__