19 #if !defined(__TBB_show_deprecation_message_atomic_H) && defined(__TBB_show_deprecated_header_message) 20 #define __TBB_show_deprecation_message_atomic_H 21 #pragma message("TBB Warning: tbb/atomic.h is deprecated. For details, please see Deprecated Features appendix in the TBB reference manual.") 24 #if defined(__TBB_show_deprecated_header_message) 25 #undef __TBB_show_deprecated_header_message 28 #ifndef __TBB_atomic_H 29 #define __TBB_atomic_H 31 #define __TBB_atomic_H_include_area 37 #define __TBB_LONG_LONG __int64 39 #define __TBB_LONG_LONG long long 44 #if _MSC_VER && !__INTEL_COMPILER 46 #pragma warning (push) 47 #pragma warning (disable: 4244 4267 4512) 67 #if __TBB_ALIGNAS_PRESENT 68 #define __TBB_DECL_ATOMIC_FIELD(t,f,a) alignas(a) t f; 69 #elif __TBB_ATTRIBUTE_ALIGNED_PRESENT 70 #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f __attribute__ ((aligned(a))); 71 #elif __TBB_DECLSPEC_ALIGN_PRESENT 72 #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f; 74 #error Do not know syntax for forcing alignment. 90 #if _MSC_VER && !_WIN64 92 typedef intptr_t
word;
97 #if __TBB_64BIT_ATOMICS 104 template<
typename value_type,
size_t size>
108 #if __TBB_ATOMIC_CTORS 109 #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S) \ 110 template<typename value_type> \ 111 struct aligned_storage<value_type,S> { \ 112 __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S) \ 113 aligned_storage() = default ; \ 114 constexpr aligned_storage(value_type value):my_value(value){} \ 118 #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S) \ 119 template<typename value_type> \ 120 struct aligned_storage<value_type,S> { \ 121 __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S) \ 126 template<
typename value_type>
129 #if __TBB_ATOMIC_CTORS 137 #if __TBB_64BIT_ATOMICS 141 template<
size_t Size, memory_semantics M>
144 #define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M) \ 145 template<> struct atomic_traits<S,M> { \ 146 typedef atomic_rep<S>::word word; \ 147 inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \ 148 return __TBB_machine_cmpswp##S##M(location,new_value,comparand); \ 150 inline static word fetch_and_add( volatile void* location, word addend ) { \ 151 return __TBB_machine_fetchadd##S##M(location,addend); \ 153 inline static word fetch_and_store( volatile void* location, word value ) { \ 154 return __TBB_machine_fetchstore##S##M(location,value); \ 158 #define __TBB_DECL_ATOMIC_PRIMITIVES(S) \ 159 template<memory_semantics M> \ 160 struct atomic_traits<S,M> { \ 161 typedef atomic_rep<S>::word word; \ 162 inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \ 163 return __TBB_machine_cmpswp##S(location,new_value,comparand); \ 165 inline static word fetch_and_add( volatile void* location, word addend ) { \ 166 return __TBB_machine_fetchadd##S(location,addend); \ 168 inline static word fetch_and_store( volatile void* location, word value ) { \ 169 return __TBB_machine_fetchstore##S(location,value); \ 173 template<memory_semantics M>
176 #define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M) \ 177 template<> struct atomic_load_store_traits<M> { \ 178 template <typename T> \ 179 inline static T load( const volatile T& location ) { \ 180 return __TBB_load_##M( location ); \ 182 template <typename T> \ 183 inline static void store( volatile T& location, T value ) { \ 184 __TBB_store_##M( location, value ); \ 188 #if __TBB_USE_FENCED_ATOMICS 201 #if __TBB_64BIT_ATOMICS 211 #if __TBB_64BIT_ATOMICS 224 #define __TBB_MINUS_ONE(T) (T(T(0)-T(1))) 236 template<
typename value_type>
245 template<
typename value_t>
247 return converter<value_t>(
value).bits;
249 template<
typename value_t>
251 converter<value_t> u;
256 template<
typename value_t>
259 template<
typename value_t>
268 template<
typename value_t>
283 #if __TBB_ATOMIC_CTORS 287 template<memory_semantics M>
289 return to_value<value_type>(
295 return fetch_and_store<full_fence>(
value);
298 template<memory_semantics M>
300 return to_value<value_type>(
306 return compare_and_swap<full_fence>(
value,comparand);
310 return to_value<value_type>(
315 template<memory_semantics M>
317 return to_value<value_type>(
323 return load<acquire>();
326 template<memory_semantics M>
332 store<release>(
value );
347 template<
typename I,
typename D,
typename StepType>
351 #if __TBB_ATOMIC_CTORS 355 template<memory_semantics M>
361 return fetch_and_add<full_fence>(addend);
364 template<memory_semantics M>
366 return fetch_and_add<M>(1);
373 template<memory_semantics M>
418 atomic: internal::atomic_impl<T> {
419 #if __TBB_ATOMIC_CTORS 421 constexpr atomic(T arg):
internal::atomic_impl<T>(arg) {}
422 constexpr atomic<T>(
const atomic<T>& rhs):
internal::atomic_impl<T>(rhs) {}
424 T operator=( T rhs ) {
426 return this->store_with_release(rhs);
428 atomic<T>& operator=(
const atomic<T>& rhs ) {this->store_with_release(rhs);
return *
this;}
431 #if __TBB_ATOMIC_CTORS 432 #define __TBB_DECL_ATOMIC(T) \ 433 template<> struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") \ 434 atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \ 435 atomic() = default; \ 436 constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {} \ 437 constexpr atomic<T>(const atomic<T>& rhs): \ 438 internal::atomic_impl_with_arithmetic<T,T,char>(rhs) {} \ 440 T operator=( T rhs ) {return store_with_release(rhs);} \ 441 atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \ 444 #define __TBB_DECL_ATOMIC(T) \ 445 template<> struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") \ 446 atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \ 447 T operator=( T rhs ) {return store_with_release(rhs);} \ 448 atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \ 452 #if __TBB_64BIT_ATOMICS 462 #if _MSC_VER && !_WIN64 463 #if __TBB_ATOMIC_CTORS 469 #define __TBB_DECL_ATOMIC_ALT(T,U) \ 470 template<> struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") \ 471 atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \ 472 atomic() = default ; \ 473 constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {} \ 474 constexpr atomic<T>(const atomic<T>& rhs): \ 475 internal::atomic_impl_with_arithmetic<T,T,char>(rhs) {} \ 477 T operator=( U rhs ) {return store_with_release(T(rhs));} \ 478 atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \ 481 #define __TBB_DECL_ATOMIC_ALT(T,U) \ 482 template<> struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") \ 483 atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> { \ 484 T operator=( U rhs ) {return store_with_release(T(rhs));} \ 485 atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;} \ 488 __TBB_DECL_ATOMIC_ALT(
unsigned,
size_t)
489 __TBB_DECL_ATOMIC_ALT(
int,ptrdiff_t)
501 #if !_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED) 507 atomic<T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {
508 #if __TBB_ATOMIC_CTORS 510 constexpr atomic(T* arg): internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T>(arg) {}
511 constexpr atomic(
const atomic<T*>& rhs): internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T>(rhs) {}
513 T* operator=( T* rhs ) {
515 return this->store_with_release(rhs);
517 atomic<T*>& operator=(
const atomic<T*>& rhs ) {
518 this->store_with_release(rhs);
return *
this;
520 T* operator->()
const {
527 atomic<void*>: internal::atomic_impl<void*> {
528 #if __TBB_ATOMIC_CTORS 530 constexpr atomic(
void* arg):
internal::atomic_impl<
void*>(arg) {}
531 constexpr atomic(
const atomic<void*>& rhs):
internal::atomic_impl<
void*>(rhs) {}
533 void* operator=(
void* rhs ) {
535 return this->store_with_release(rhs);
537 atomic<void*>& operator=(
const atomic<void*>& rhs ) {
538 this->store_with_release(rhs);
return *
this;
545 template <memory_semantics M,
typename T>
546 T
load (
const atomic<T>& a ) {
return a.template load<M>(); }
548 template <memory_semantics M,
typename T>
551 namespace interface6{
563 template<memory_semantics M,
typename T >
564 void swap(atomic<T> & lhs, atomic<T> & rhs){
565 T tmp = load<M>(lhs);
566 store<M>(lhs,load<M>(rhs));
573 return (atomic<T>&)t;
579 #if _MSC_VER && !__INTEL_COMPILER 580 #pragma warning (pop) 581 #endif // warnings are restored 584 #undef __TBB_atomic_H_include_area static value_t to_value(typename converter< value_t >::bits_type bits)
value_type operator+=(D value)
value_type fetch_and_increment()
value_type operator++(int)
static converter< value_t >::bits_type to_bits(value_t value)
class __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::aligned_space is deprecated, use std::aligned_storage") aligned_space
Block of space aligned sufficiently to construct an array T with N elements.
value_type fetch_and_decrement()
value_type fetch_and_increment()
value_type compare_and_swap(value_type value, value_type comparand)
value_type fetch_and_add(D addend)
#define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S)
Base class that provides basic functionality for atomic<T> without fetch_and_add.
converter(value_type a_value)
__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(full_fence)
#define __TBB_DECL_ATOMIC(T)
Primary template for atomic.
#define __TBB_DECL_ATOMIC_PRIMITIVES(S)
void __TBB_store_with_release(volatile T &location, V value)
memory_semantics
Specifies memory semantics.
struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") atomic< T * > struct __TBB_DEPRECATED_IN_VERBOSE_MODE_MSG("tbb::atomic is deprecated, use std::atomic") atomic< void * > T load(const atomic< T > &a)
Specialization for atomic<T*> with arithmetic and operator->.
aligned_storage< T, sizeof(T)> my_storage
atomic_impl_with_arithmetic()=default
static converter< value_t >::bits_type & to_bits_ref(value_t &value)
atomic< T > make_atomic(T t)
Make an atomic for use in an initialization (list), as an alternative to zero-initialization or norma...
#define __TBB_MINUS_ONE(T)
Additive inverse of 1 for type T.
ptr_converter(value_t *a_value)
constexpr aligned_storage(value_type value)
void store(atomic< T > &a, T value)
value_type store_with_release(value_type rhs)
Base class that provides basic functionality for atomic<T> with fetch_and_add.
value_type fetch_and_store(value_type value)
atomic_rep< sizeof(value_type)>::word bits_type
Union type used to convert type T to underlying integral type.
constexpr atomic_impl_with_arithmetic(value_type value)
void store(value_type value)
void swap(atomic< T > &lhs, atomic< T > &rhs)
value_type operator-=(D value)
value_type operator--(int)
value_type fetch_and_add(D addend)
value_type compare_and_swap(value_type value, value_type comparand)
atomic< T > & as_atomic(T &t)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
value_type fetch_and_decrement()
void store(value_type value)
value_type fetch_and_store(value_type value)
#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S, M)
T __TBB_load_with_acquire(const volatile T &location)
constexpr atomic_impl(value_type value)