00001 namespace detail {
00002
00003 template<class _Tp>
00004 bool atomic_compare_exchange_strong(volatile _Tp* __a, _Tp* __e, _Tp* __d, std::memory_order _succ, std::memory_order _fail) {
00005 static_assert(sizeof(_Tp) <= 8, "Operation undefined on larger types");
00006 return __sync_bool_compare_and_swap(__a, *__e, *__d);
00007 }
00008
00009 }
00010
00011 template<class _Tp>
00012 void __atomic_store(volatile _Tp* __a, _Tp* __i, std::memory_order _m) {
00013 switch (_m) {
00014 case std::memory_order_relaxed: *__a = *__i; break;
00015 default: __sync_synchronize(); *__a = *__i; __sync_synchronize(); break;
00016 }
00017 }
00018
00019 template<class _Tp>
00020 void __atomic_load(volatile _Tp* __a, _Tp* __i, std::memory_order _m) {
00021 switch (_m) {
00022 case std::memory_order_relaxed: *__i = *__a; break;
00023 default: __sync_synchronize(); *__i = *__a; __sync_synchronize(); break;
00024 }
00025 }
00026
00027 template<class _Tp>
00028 void __atomic_load(volatile const _Tp* __a, _Tp* __i, std::memory_order _m) {
00029 switch (_m) {
00030 case std::memory_order_relaxed: *__i = *__a; break;
00031 default: __sync_synchronize(); *__i = *__a; __sync_synchronize(); break;
00032 }
00033 }
00034
00035 template<class _Tp>
00036 bool __atomic_compare_exchange(volatile _Tp* __a, _Tp* __e, _Tp* __d, bool _weak, std::memory_order _succ, std::memory_order _fail) {
00037 return detail::atomic_compare_exchange_strong(__a, __e, __d, _succ, _fail);
00038 }
00039
00040 template<class _Tp>
00041 _Tp __atomic_fetch_xor(volatile _Tp* __a, _Tp __i, std::memory_order _m) {
00042 return __sync_fetch_and_xor(__a, __i);
00043 }
00044
00045 template<class _Tp>
00046 _Tp __atomic_fetch_or(volatile _Tp* __a, _Tp __i, std::memory_order _m) {
00047 return __sync_fetch_and_or(__a, __i);
00048 }
00049
00050 template<class _Tp>
00051 _Tp __atomic_fetch_add(volatile _Tp* __a, _Tp __i, std::memory_order _m) {
00052 return __sync_fetch_and_add(__a, __i);
00053 }
00054
00055 template<class _Tp>
00056 _Tp __atomic_exchange(volatile _Tp* __a, _Tp __i, std::memory_order _m) {
00057
00058 return __sync_lock_test_and_set(__a, __i);
00059 }