23 # if defined(__SUNPRO_CC)
24 # include <drizzled/atomic/sun_studio.h>
26 # if !defined(__ICC) && !defined(__clang__) && (defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(__SUNPRO_CC))
27 # include <drizzled/atomic/gcc_traits.h>
28 # define ATOMIC_TRAITS internal::gcc_traits
30 # define ATOMIC_TRAITS internal::pthread_traits
33 # if (SIZEOF_SIZE_T >= SIZEOF_LONG_LONG) || (!defined(HAVE_GCC_ATOMIC_BUILTINS) || !defined(__SUNPRO_CC)) || defined(__ppc__)
35 # include <drizzled/atomic/pthread_traits.h>
48 template<
typename I,
typename D,
typename T >
57 value_type add_and_fetch( D addend )
59 return traits.add_and_fetch(&this->my_value, addend);
62 value_type fetch_and_add( D addend )
64 return traits.fetch_and_add(&this->my_value, addend);
67 value_type fetch_and_increment()
69 return traits.fetch_and_increment(&this->my_value);
72 value_type fetch_and_decrement()
74 return traits.fetch_and_decrement(&this->my_value);
77 value_type fetch_and_store( value_type value )
79 return traits.fetch_and_store(&this->my_value, value);
82 bool compare_and_swap( value_type value, value_type comparand )
84 return traits.compare_and_swap(&this->my_value, value, comparand);
87 operator value_type()
const volatile
89 return traits.fetch(&this->my_value);
92 value_type& _internal_reference()
const
94 return this->my_value;
98 value_type store_with_release( value_type rhs )
100 return traits.store_with_release(&this->my_value, rhs);
114 return operator+=(D(0)-addend);
117 value_type increment()
119 return add_and_fetch(1);
122 value_type decrement()
124 return add_and_fetch(D(-1));
138 #define __DRIZZLE_DECL_ATOMIC(T) \
139 template<> struct atomic<T> \
140 : internal::atomic_impl<T,T,ATOMIC_TRAITS<T,T> > { \
141 atomic<T>() : internal::atomic_impl<T,T,ATOMIC_TRAITS<T,T> >() {} \
142 atomic<T>& operator=( T rhs ) { store_with_release(rhs); return *this; } \
147 __DRIZZLE_DECL_ATOMIC(
long)
148 __DRIZZLE_DECL_ATOMIC(
unsigned long)
149 __DRIZZLE_DECL_ATOMIC(
unsigned int)
150 __DRIZZLE_DECL_ATOMIC(
int)
151 __DRIZZLE_DECL_ATOMIC(
unsigned short)
152 __DRIZZLE_DECL_ATOMIC(
short)
153 __DRIZZLE_DECL_ATOMIC(
char)
154 __DRIZZLE_DECL_ATOMIC(
signed char)
155 __DRIZZLE_DECL_ATOMIC(
unsigned char)
156 __DRIZZLE_DECL_ATOMIC(
bool)
162 # if !defined(__ppc__) && (defined(_INT64_TYPE) || defined(_LP64))
163 __DRIZZLE_DECL_ATOMIC(
long long)
164 __DRIZZLE_DECL_ATOMIC(
unsigned long long)
166 # define __DRIZZLE_DECL_ATOMIC64(T) \
167 template<> struct atomic<T> \
168 : internal::atomic_impl<T,T,internal::pthread_traits<T,T> > { \
170 : internal::atomic_impl<T,T,internal::pthread_traits<T,T> >() {} \
171 T operator=( T rhs ) { return store_with_release(rhs); } \
173 __DRIZZLE_DECL_ATOMIC64(
long long)
174 __DRIZZLE_DECL_ATOMIC64(
unsigned long long)
Primary template for atomic.