diff options
| author | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-18 13:52:39 +0000 |
|---|---|---|
| committer | redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-18 13:52:39 +0000 |
| commit | d92ae4c67fce4f2984061aca84f7e0319e01d027 (patch) | |
| tree | fd998863a3c6a189e7248fe2024450ae6b8ca589 /libstdc++-v3/include/bits | |
| parent | a0aa85e7baafa470786177837372500822dc119c (diff) | |
| download | ppe42-gcc-d92ae4c67fce4f2984061aca84f7e0319e01d027.tar.gz ppe42-gcc-d92ae4c67fce4f2984061aca84f7e0319e01d027.zip | |
* include/bits/shared_ptr_base.h (_Sp_counted_base<_S_single>): Use
non-atomic operations.
* testsuite/20_util/shared_ptr/cons/43820_neg.cc: Adjust line number.
* testsuite/20_util/shared_ptr/cons/void_neg.cc: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204949 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/bits')
| -rw-r--r-- | libstdc++-v3/include/bits/shared_ptr_base.h | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/libstdc++-v3/include/bits/shared_ptr_base.h b/libstdc++-v3/include/bits/shared_ptr_base.h index cf90d7a7cb3..68ccc9e1150 100644 --- a/libstdc++-v3/include/bits/shared_ptr_base.h +++ b/libstdc++-v3/include/bits/shared_ptr_base.h @@ -209,11 +209,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Sp_counted_base<_S_single>:: _M_add_ref_lock() { - if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0) - { - _M_use_count = 0; - __throw_bad_weak_ptr(); - } + if (_M_use_count == 0) + __throw_bad_weak_ptr(); + ++_M_use_count; } template<> @@ -248,6 +246,41 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __ATOMIC_RELAXED)); } + template<> + inline void + _Sp_counted_base<_S_single>::_M_add_ref_copy() + { ++_M_use_count; } + + template<> + inline void + _Sp_counted_base<_S_single>::_M_release() noexcept + { + if (--_M_use_count == 0) + { + _M_dispose(); + if (--_M_weak_count == 0) + _M_destroy(); + } + } + + template<> + inline void + _Sp_counted_base<_S_single>::_M_weak_add_ref() noexcept + { ++_M_weak_count; } + + template<> + inline void + _Sp_counted_base<_S_single>::_M_weak_release() noexcept + { + if (--_M_weak_count == 0) + _M_destroy(); + } + + template<> + inline long + _Sp_counted_base<_S_single>::_M_get_use_count() const noexcept + { return _M_use_count; } + // Forward declarations. template<typename _Tp, _Lock_policy _Lp = __default_lock_policy> |

