diff --git a/include/boost/smart_ptr/detail/atomic_count.hpp b/include/boost/smart_ptr/detail/atomic_count.hpp index 456b2db..749b3f0 100644 --- a/include/boost/smart_ptr/detail/atomic_count.hpp +++ b/include/boost/smart_ptr/detail/atomic_count.hpp @@ -43,8 +43,9 @@ // Memory Ordering: acquire/release // -#include +#include #include +#include #if defined( BOOST_AC_DISABLE_THREADS ) # include @@ -73,6 +74,9 @@ #elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 ) # include +#elif defined( BOOST_SP_HAS_GCC_INTRINSICS ) +# include + #elif !defined( BOOST_NO_CXX11_HDR_ATOMIC ) # include diff --git a/include/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp b/include/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp new file mode 100644 index 0000000..801a7cb --- /dev/null +++ b/include/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp @@ -0,0 +1,63 @@ +#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED +#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED + +// boost/detail/atomic_count_gcc_atomic.hpp +// +// atomic_count for g++ 4.7+ +// +// Copyright 2007, 2020 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include + +#if defined(BOOST_SP_REPORT_IMPLEMENTATION) + +#include +BOOST_PRAGMA_MESSAGE("Using __atomic atomic_count") + +#endif + +namespace boost +{ + +namespace detail +{ + +class atomic_count +{ +public: + + explicit atomic_count( long v ): value_( static_cast< boost::int_least32_t >( v ) ) + { + } + + long operator++() + { + return __atomic_add_fetch( &value_, +1, __ATOMIC_ACQ_REL ); + } + + long operator--() + { + return __atomic_add_fetch( &value_, -1, __ATOMIC_ACQ_REL ); + } + + operator long() const + { + return __atomic_load_n( &value_, __ATOMIC_ACQUIRE ); + } + +private: + + atomic_count(atomic_count const &); + atomic_count & operator=(atomic_count const &); + + boost::int_least32_t value_; +}; + +} // namespace detail + +} // namespace boost + +#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_ATOMIC_HPP_INCLUDED diff --git a/include/boost/smart_ptr/detail/atomic_count_sync.hpp b/include/boost/smart_ptr/detail/atomic_count_sync.hpp index c65d1e9..65b42c8 100644 --- a/include/boost/smart_ptr/detail/atomic_count_sync.hpp +++ b/include/boost/smart_ptr/detail/atomic_count_sync.hpp @@ -38,7 +38,7 @@ class atomic_count { public: - explicit atomic_count( long v ) : value_( static_cast< boost::int_least32_t >( v ) ) + explicit atomic_count( long v ): value_( static_cast< boost::int_least32_t >( v ) ) { }