diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-09-13 11:24:46 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-09-13 11:25:39 +0900 |
commit | 4fadd968fa12130524c8380f33fcfe25d4de79e5 (patch) | |
tree | fd26a490cd15388d42fc6652b3c5c13012e7f93e /boost/smart_ptr/atomic_shared_ptr.hpp | |
parent | b5c87084afaef42b2d058f68091be31988a6a874 (diff) | |
download | boost-upstream/1.65.0.tar.gz boost-upstream/1.65.0.tar.bz2 boost-upstream/1.65.0.zip |
Imported Upstream version 1.65.0upstream/1.65.0
Change-Id: Icf8400b375482cb11bcf77440a6934ba360d6ba4
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'boost/smart_ptr/atomic_shared_ptr.hpp')
-rw-r--r-- | boost/smart_ptr/atomic_shared_ptr.hpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/boost/smart_ptr/atomic_shared_ptr.hpp b/boost/smart_ptr/atomic_shared_ptr.hpp new file mode 100644 index 0000000000..d1efa8e280 --- /dev/null +++ b/boost/smart_ptr/atomic_shared_ptr.hpp @@ -0,0 +1,183 @@ +#ifndef BOOST_SMART_PTR_ATOMIC_SHARED_PTR_HPP_INCLUDED +#define BOOST_SMART_PTR_ATOMIC_SHARED_PTR_HPP_INCLUDED + +// +// atomic_shared_ptr.hpp +// +// Copyright 2017 Peter Dimov +// +// 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) +// +// See http://www.boost.org/libs/smart_ptr/ for documentation. +// + +#include <boost/smart_ptr/shared_ptr.hpp> +#include <boost/smart_ptr/detail/spinlock.hpp> +#include <cstring> + +namespace boost +{ + +template<class T> class atomic_shared_ptr +{ +private: + + boost::shared_ptr<T> p_; + + mutable boost::detail::spinlock l_; + + atomic_shared_ptr(const atomic_shared_ptr&); + atomic_shared_ptr& operator=(const atomic_shared_ptr&); + +private: + + bool compare_exchange( shared_ptr<T>& v, shared_ptr<T> w ) BOOST_SP_NOEXCEPT + { + l_.lock(); + + if( p_._internal_equiv( v ) ) + { + p_.swap( w ); + + l_.unlock(); + return true; + } + else + { + shared_ptr<T> tmp( p_ ); + + l_.unlock(); + + tmp.swap( v ); + return false; + } + } + +public: + +#if !defined( BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX ) && !defined( BOOST_NO_CXX11_CONSTEXPR ) + + constexpr atomic_shared_ptr() BOOST_SP_NOEXCEPT: l_ BOOST_DETAIL_SPINLOCK_INIT + { + } + +#else + + atomic_shared_ptr() BOOST_SP_NOEXCEPT + { + boost::detail::spinlock init = BOOST_DETAIL_SPINLOCK_INIT; + std::memcpy( &l_, &init, sizeof( init ) ); + } + +#endif + + atomic_shared_ptr( shared_ptr<T> p ) BOOST_SP_NOEXCEPT +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + : p_( std::move( p ) ) +#else + : p_( p ) +#endif + { + boost::detail::spinlock init = BOOST_DETAIL_SPINLOCK_INIT; + std::memcpy( &l_, &init, sizeof( init ) ); + } + + atomic_shared_ptr& operator=( shared_ptr<T> r ) BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + p_.swap( r ); + + return *this; + } + + BOOST_CONSTEXPR bool is_lock_free() const BOOST_SP_NOEXCEPT + { + return false; + } + + shared_ptr<T> load( int = 0 ) const BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + return p_; + } + + operator shared_ptr<T>() const BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + return p_; + } + + void store( shared_ptr<T> r, int = 0 ) BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + p_.swap( r ); + } + + shared_ptr<T> exchange( shared_ptr<T> r, int = 0 ) BOOST_SP_NOEXCEPT + { + { + boost::detail::spinlock::scoped_lock lock( l_ ); + p_.swap( r ); + } + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + + return std::move( r ); + +#else + + return r; + +#endif + } + + bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, int, int ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + + bool compare_exchange_weak( shared_ptr<T>& v, const shared_ptr<T>& w, int = 0 ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + + bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, int, int ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + + bool compare_exchange_strong( shared_ptr<T>& v, const shared_ptr<T>& w, int = 0 ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + + bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, int, int ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + + bool compare_exchange_weak( shared_ptr<T>& v, shared_ptr<T>&& w, int = 0 ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + + bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, int, int ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + + bool compare_exchange_strong( shared_ptr<T>& v, shared_ptr<T>&& w, int = 0 ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + +#endif +}; + +} // namespace boost + +#endif // #ifndef BOOST_SMART_PTR_ATOMIC_SHARED_PTR_HPP_INCLUDED |