00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef _GALOIS_UTIL_ATOMIC_H
00021 #define _GALOIS_UTIL_ATOMIC_H
00022
00023 namespace Galois {
00024
00026
00029 template<typename T>
00030 class GAtomic {
00031 T val;
00032
00033 public:
00035 explicit GAtomic(const T& i) :val(i) {}
00037 T operator+=(const T& rhs) {
00038 return __sync_add_and_fetch(&val, rhs);
00039 }
00041 T operator-=(const T& rhs) {
00042 return __sync_sub_and_fetch(&val, rhs);
00043 }
00045 T operator++() {
00046 return __sync_add_and_fetch(&val, 1);
00047 }
00049 T operator++(int) {
00050 return __sync_fetch_and_add(&val, 1);
00051 }
00053 T operator--() {
00054 return __sync_sub_and_fetch(&val, 1);
00055 }
00057 T operator--(int) {
00058 return __sync_fetch_and_sub(&val, 1);
00059 }
00061 operator T() const {
00062 return val;
00063 }
00065 T operator=(const T& i) {
00066 val = i;
00067 return i;
00068 }
00070 T operator=(const GAtomic& i) {
00071 T iv = (T)i;
00072 val = iv;
00073 return iv;
00074 }
00076 bool cas (const T& expected, const T& updated) {
00077 return __sync_bool_compare_and_swap (&val, expected, updated);
00078 }
00079 };
00080
00081 template<>
00082 class GAtomic<bool> {
00083 bool val;
00084 public:
00086 explicit GAtomic(bool i) :val(i) {}
00087
00089 operator bool() const {
00090 return val;
00091 }
00092
00094 bool operator=(bool i) {
00095 val = i;
00096 return i;
00097 }
00099 bool operator=(const GAtomic<bool>& i) {
00100 bool iv = (bool)i;
00101 val = iv;
00102 return iv;
00103 }
00105 bool cas (bool expected, bool updated) {
00106 return __sync_bool_compare_and_swap (&val, expected, updated);
00107 }
00108 };
00109
00110 }
00111
00112
00113
00114 #endif // _GALOIS_UTIL_ATOMIC_H
00115