21
21
#ifndef DRIZZLED_ATOMICS_H
22
22
#define DRIZZLED_ATOMICS_H
24
#if defined(HAVE_LIBTBB)
25
# include <tbb/atomic.h>
24
28
# if defined(__SUNPRO_CC)
25
29
# include <drizzled/atomic/sun_studio.h>
27
# if !defined(__ICC) && !defined(__clang__) && (defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(__SUNPRO_CC))
31
# if defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(__SUNPRO_CC)
28
32
# include <drizzled/atomic/gcc_traits.h>
29
33
# define ATOMIC_TRAITS internal::gcc_traits
30
34
# else /* use pthread impl */
31
# define ATOMIC_TRAITS internal::pthread_traits
34
# if (SIZEOF_SIZE_T >= SIZEOF_LONG_LONG) || (!defined(HAVE_GCC_ATOMIC_BUILTINS) || !defined(__SUNPRO_CC)) || defined(__ppc__)
35
35
# include <pthread.h>
36
36
# include <drizzled/atomic/pthread_traits.h>
37
# define ATOMIC_TRAITS internal::pthread_traits
42
43
namespace internal {
83
76
return traits.fetch_and_store(&this->my_value, value);
86
bool compare_and_swap( value_type value, value_type comparand )
79
value_type compare_and_swap( value_type value, value_type comparand )
88
81
return traits.compare_and_swap(&this->my_value, value, comparand);
108
atomic_impl<I,D,T>& operator+=( D addend )
101
value_type operator+=( D addend )
103
return fetch_and_add(addend)+addend;
114
atomic_impl<I,D,T>& operator-=( D addend )
106
value_type operator-=( D addend )
116
108
// Additive inverse of addend computed using binary minus,
117
109
// instead of unary minus, for sake of avoiding compiler warnings.
118
110
return operator+=(D(0)-addend);
121
value_type increment()
123
return add_and_fetch(1);
126
value_type decrement()
128
return add_and_fetch(D(-1));
113
value_type operator++() {
114
return fetch_and_add(1)+1;
117
value_type operator--() {
118
return fetch_and_add(D(-1))-1;
121
value_type operator++(int) {
122
return fetch_and_add(1);
125
value_type operator--(int) {
126
return fetch_and_add(D(-1));
132
131
} /* namespace internal */
142
#define __DRIZZLE_DECL_ATOMIC(T) \
140
#define __TBB_DECL_ATOMIC(T) \
143
141
template<> struct atomic<T> \
144
142
: internal::atomic_impl<T,T,ATOMIC_TRAITS<T,T> > { \
145
143
atomic<T>() : internal::atomic_impl<T,T,ATOMIC_TRAITS<T,T> >() {} \
146
atomic<T>& operator=( T rhs ) { store_with_release(rhs); return *this; } \
151
__DRIZZLE_DECL_ATOMIC(long)
152
__DRIZZLE_DECL_ATOMIC(unsigned long)
153
__DRIZZLE_DECL_ATOMIC(unsigned int)
154
__DRIZZLE_DECL_ATOMIC(int)
155
__DRIZZLE_DECL_ATOMIC(unsigned short)
156
__DRIZZLE_DECL_ATOMIC(short)
157
__DRIZZLE_DECL_ATOMIC(char)
158
__DRIZZLE_DECL_ATOMIC(signed char)
159
__DRIZZLE_DECL_ATOMIC(unsigned char)
160
__DRIZZLE_DECL_ATOMIC(bool)
162
/* 32-bit platforms don't have a GCC atomic operation for 64-bit types,
163
* so we'll use pthread locks to handler 64-bit types on that platforms
166
# if !defined(__ppc__) && (defined(_INT64_TYPE) || defined(_LP64))
167
__DRIZZLE_DECL_ATOMIC(long long)
168
__DRIZZLE_DECL_ATOMIC(unsigned long long)
170
# define __DRIZZLE_DECL_ATOMIC64(T) \
171
template<> struct atomic<T> \
172
: internal::atomic_impl<T,T,internal::pthread_traits<T,T> > { \
174
: internal::atomic_impl<T,T,internal::pthread_traits<T,T> >() {} \
175
144
T operator=( T rhs ) { return store_with_release(rhs); } \
177
__DRIZZLE_DECL_ATOMIC64(long long)
178
__DRIZZLE_DECL_ATOMIC64(unsigned long long)
147
__TBB_DECL_ATOMIC(long long)
148
__TBB_DECL_ATOMIC(unsigned long long)
149
__TBB_DECL_ATOMIC(long)
150
__TBB_DECL_ATOMIC(unsigned long)
151
__TBB_DECL_ATOMIC(unsigned int)
152
__TBB_DECL_ATOMIC(int)
153
__TBB_DECL_ATOMIC(unsigned short)
154
__TBB_DECL_ATOMIC(short)
155
__TBB_DECL_ATOMIC(char)
156
__TBB_DECL_ATOMIC(signed char)
157
__TBB_DECL_ATOMIC(unsigned char)
160
#endif /* defined(HAVE_LIBTBB) */
184
#endif /* DRIZZLED_ATOMICS_H */
162
#endif /* DRIZZLED_ATOMIC_H */