123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605 |
- #ifndef BOOST_ATOMIC_DETAIL_BASE_HPP
- #define BOOST_ATOMIC_DETAIL_BASE_HPP
- // Copyright (c) 2009 Helge Bahmann
- // Copyright (c) 2013 Tim Blechmann
- //
- // Distributed under the Boost Software License, Version 1.0.
- // See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // Base class definition and fallback implementation.
- // To be overridden (through partial specialization) by
- // platform implementations.
- #include <string.h>
- #include <cstddef>
- #include <boost/cstdint.hpp>
- #include <boost/atomic/detail/config.hpp>
- #include <boost/atomic/detail/lockpool.hpp>
- #ifdef BOOST_HAS_PRAGMA_ONCE
- #pragma once
- #endif
- #define BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
- bool \
- compare_exchange_strong( \
- value_type & expected, \
- value_type desired, \
- memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
- { \
- return compare_exchange_strong(expected, desired, order, calculate_failure_order(order)); \
- } \
- \
- bool \
- compare_exchange_weak( \
- value_type & expected, \
- value_type desired, \
- memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT \
- { \
- return compare_exchange_weak(expected, desired, order, calculate_failure_order(order)); \
- } \
- #define BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
- value_type \
- operator++(int) volatile BOOST_NOEXCEPT \
- { \
- return fetch_add(1); \
- } \
- \
- value_type \
- operator++(void) volatile BOOST_NOEXCEPT \
- { \
- return fetch_add(1) + 1; \
- } \
- \
- value_type \
- operator--(int) volatile BOOST_NOEXCEPT \
- { \
- return fetch_sub(1); \
- } \
- \
- value_type \
- operator--(void) volatile BOOST_NOEXCEPT \
- { \
- return fetch_sub(1) - 1; \
- } \
- \
- value_type \
- operator+=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return fetch_add(v) + v; \
- } \
- \
- value_type \
- operator-=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return fetch_sub(v) - v; \
- } \
- #define BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
- value_type \
- operator++(int) volatile BOOST_NOEXCEPT \
- { \
- return fetch_add(1); \
- } \
- \
- value_type \
- operator++(void) volatile BOOST_NOEXCEPT \
- { \
- return (char*)fetch_add(1) + 1; \
- } \
- \
- value_type \
- operator--(int) volatile BOOST_NOEXCEPT \
- { \
- return fetch_sub(1); \
- } \
- \
- value_type \
- operator--(void) volatile BOOST_NOEXCEPT \
- { \
- return (char*)fetch_sub(1) - 1; \
- } \
- \
- value_type \
- operator+=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return (char*)fetch_add(v) + v; \
- } \
- \
- value_type \
- operator-=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return (char*)fetch_sub(v) - v; \
- } \
- #define BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
- value_type \
- operator&=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return fetch_and(v) & v; \
- } \
- \
- value_type \
- operator|=(difference_type v) volatile BOOST_NOEXCEPT \
- { \
- return fetch_or(v) | v; \
- } \
- \
- value_type \
- operator^=(difference_type v) volatile BOOST_NOEXCEPT\
- { \
- return fetch_xor(v) ^ v; \
- } \
- #define BOOST_ATOMIC_DECLARE_POINTER_OPERATORS \
- BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
- BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
- #define BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS \
- BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
- BOOST_ATOMIC_DECLARE_VOID_POINTER_ADDITIVE_OPERATORS \
- #define BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS \
- BOOST_ATOMIC_DECLARE_BASE_OPERATORS \
- BOOST_ATOMIC_DECLARE_ADDITIVE_OPERATORS \
- BOOST_ATOMIC_DECLARE_BIT_OPERATORS \
- namespace boost {
- namespace atomics {
- namespace detail {
- inline memory_order
- calculate_failure_order(memory_order order)
- {
- switch(order)
- {
- case memory_order_acq_rel:
- return memory_order_acquire;
- case memory_order_release:
- return memory_order_relaxed;
- default:
- return order;
- }
- }
- template<typename T, typename C, unsigned int Size, bool Sign>
- class base_atomic
- {
- private:
- typedef base_atomic this_type;
- typedef T value_type;
- typedef lockpool::scoped_lock guard_type;
- protected:
- typedef value_type const& value_arg_type;
- public:
- BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
- BOOST_CONSTEXPR explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : v_(v)
- {}
- void
- store(value_type const& v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- char * storage = storage_ptr();
- guard_type guard(storage);
- memcpy(storage, &v, sizeof(value_type));
- }
- value_type
- load(memory_order /*order*/ = memory_order_seq_cst) volatile const BOOST_NOEXCEPT
- {
- char * storage = storage_ptr();
- guard_type guard(storage);
- value_type v;
- memcpy(&v, storage, sizeof(value_type));
- return v;
- }
- bool
- compare_exchange_strong(
- value_type & expected,
- value_type const& desired,
- memory_order /*success_order*/,
- memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
- {
- char * storage = storage_ptr();
- guard_type guard(storage);
- if (memcmp(storage, &expected, sizeof(value_type)) == 0) {
- memcpy(storage, &desired, sizeof(value_type));
- return true;
- } else {
- memcpy(&expected, storage, sizeof(value_type));
- return false;
- }
- }
- bool
- compare_exchange_weak(
- value_type & expected,
- value_type const& desired,
- memory_order success_order,
- memory_order failure_order) volatile BOOST_NOEXCEPT
- {
- return compare_exchange_strong(expected, desired, success_order, failure_order);
- }
- value_type
- exchange(value_type const& v, memory_order /*order*/=memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- char * storage = storage_ptr();
- guard_type guard(storage);
- value_type tmp;
- memcpy(&tmp, storage, sizeof(value_type));
- memcpy(storage, &v, sizeof(value_type));
- return tmp;
- }
- bool
- is_lock_free(void) const volatile BOOST_NOEXCEPT
- {
- return false;
- }
- BOOST_ATOMIC_DECLARE_BASE_OPERATORS
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
- private:
- char * storage_ptr() volatile const BOOST_NOEXCEPT
- {
- return const_cast<char *>(&reinterpret_cast<char const volatile &>(v_));
- }
- T v_;
- };
- template<typename T, unsigned int Size, bool Sign>
- class base_atomic<T, int, Size, Sign>
- {
- private:
- typedef base_atomic this_type;
- typedef T value_type;
- typedef T difference_type;
- typedef lockpool::scoped_lock guard_type;
- protected:
- typedef value_type value_arg_type;
- public:
- BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
- BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
- void
- store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- v_ = v;
- }
- value_type
- load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type v = const_cast<const volatile value_type &>(v_);
- return v;
- }
- value_type
- exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ = v;
- return old;
- }
- bool
- compare_exchange_strong(value_type & expected, value_type desired,
- memory_order /*success_order*/,
- memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- if (v_ == expected) {
- v_ = desired;
- return true;
- } else {
- expected = v_;
- return false;
- }
- }
- bool
- compare_exchange_weak(value_type & expected, value_type desired,
- memory_order success_order,
- memory_order failure_order) volatile BOOST_NOEXCEPT
- {
- return compare_exchange_strong(expected, desired, success_order, failure_order);
- }
- value_type
- fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ += v;
- return old;
- }
- value_type
- fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ -= v;
- return old;
- }
- value_type
- fetch_and(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ &= v;
- return old;
- }
- value_type
- fetch_or(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ |= v;
- return old;
- }
- value_type
- fetch_xor(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ ^= v;
- return old;
- }
- bool
- is_lock_free(void) const volatile BOOST_NOEXCEPT
- {
- return false;
- }
- BOOST_ATOMIC_DECLARE_INTEGRAL_OPERATORS
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
- private:
- value_type v_;
- };
- template<typename T, unsigned int Size, bool Sign>
- class base_atomic<T *, void *, Size, Sign>
- {
- private:
- typedef base_atomic this_type;
- typedef T * value_type;
- typedef std::ptrdiff_t difference_type;
- typedef lockpool::scoped_lock guard_type;
- protected:
- typedef value_type value_arg_type;
- public:
- BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
- BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
- void
- store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- v_ = v;
- }
- value_type
- load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type v = const_cast<const volatile value_type &>(v_);
- return v;
- }
- value_type
- exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ = v;
- return old;
- }
- bool
- compare_exchange_strong(value_type & expected, value_type desired,
- memory_order /*success_order*/,
- memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- if (v_ == expected) {
- v_ = desired;
- return true;
- } else {
- expected = v_;
- return false;
- }
- }
- bool
- compare_exchange_weak(value_type & expected, value_type desired,
- memory_order success_order,
- memory_order failure_order) volatile BOOST_NOEXCEPT
- {
- return compare_exchange_strong(expected, desired, success_order, failure_order);
- }
- value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ += v;
- return old;
- }
- value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ -= v;
- return old;
- }
- bool
- is_lock_free(void) const volatile BOOST_NOEXCEPT
- {
- return false;
- }
- BOOST_ATOMIC_DECLARE_POINTER_OPERATORS
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
- private:
- value_type v_;
- };
- template<unsigned int Size, bool Sign>
- class base_atomic<void *, void *, Size, Sign>
- {
- private:
- typedef base_atomic this_type;
- typedef std::ptrdiff_t difference_type;
- typedef void * value_type;
- typedef lockpool::scoped_lock guard_type;
- protected:
- typedef value_type value_arg_type;
- public:
- BOOST_DEFAULTED_FUNCTION(base_atomic(void), {})
- BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : v_(v) {}
- void
- store(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- v_ = v;
- }
- value_type
- load(memory_order /*order*/ = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type v = const_cast<const volatile value_type &>(v_);
- return v;
- }
- value_type
- exchange(value_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- v_ = v;
- return old;
- }
- bool
- compare_exchange_strong(value_type & expected, value_type desired,
- memory_order /*success_order*/,
- memory_order /*failure_order*/) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- if (v_ == expected) {
- v_ = desired;
- return true;
- } else {
- expected = v_;
- return false;
- }
- }
- bool
- compare_exchange_weak(value_type & expected, value_type desired,
- memory_order success_order,
- memory_order failure_order) volatile BOOST_NOEXCEPT
- {
- return compare_exchange_strong(expected, desired, success_order, failure_order);
- }
- bool
- is_lock_free(void) const volatile BOOST_NOEXCEPT
- {
- return false;
- }
- value_type fetch_add(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile BOOST_NOEXCEPT
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- char * cv = reinterpret_cast<char*>(old);
- cv += v;
- v_ = cv;
- return old;
- }
- value_type fetch_sub(difference_type v, memory_order /*order*/ = memory_order_seq_cst) volatile
- {
- guard_type guard(const_cast<value_type *>(&v_));
- value_type old = v_;
- char * cv = reinterpret_cast<char*>(old);
- cv -= v;
- v_ = cv;
- return old;
- }
- BOOST_ATOMIC_DECLARE_VOID_POINTER_OPERATORS
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
- private:
- value_type v_;
- };
- }
- }
- }
- #endif
|