Commit ad098ad1 by Jonathan Wakely Committed by Jonathan Wakely

shared_ptr_base.h (_Sp_counted_base<_S_single>): Use non-atomic operations.

	* 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.

From-SVN: r204949
parent 6d3f673c
2013-11-18 Jonathan Wakely <jwakely.gcc@gmail.com>
* 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.
2013-11-16 Edward Smith-Rowland <3dw4rd@verizon.net> 2013-11-16 Edward Smith-Rowland <3dw4rd@verizon.net>
Implement N3762 string_view: a non-owning reference to a string. Implement N3762 string_view: a non-owning reference to a string.
......
...@@ -209,11 +209,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -209,11 +209,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_Sp_counted_base<_S_single>:: _Sp_counted_base<_S_single>::
_M_add_ref_lock() _M_add_ref_lock()
{ {
if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, 1) == 0) if (_M_use_count == 0)
{ __throw_bad_weak_ptr();
_M_use_count = 0; ++_M_use_count;
__throw_bad_weak_ptr();
}
} }
template<> template<>
...@@ -248,6 +246,41 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -248,6 +246,41 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__ATOMIC_RELAXED)); __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. // Forward declarations.
template<typename _Tp, _Lock_policy _Lp = __default_lock_policy> template<typename _Tp, _Lock_policy _Lp = __default_lock_policy>
......
...@@ -32,7 +32,7 @@ void test01() ...@@ -32,7 +32,7 @@ void test01()
{ {
X* px = 0; X* px = 0;
std::shared_ptr<X> p1(px); // { dg-error "here" } std::shared_ptr<X> p1(px); // { dg-error "here" }
// { dg-error "incomplete" "" { target *-*-* } 779 } // { dg-error "incomplete" "" { target *-*-* } 812 }
std::shared_ptr<X> p9(ap()); // { dg-error "here" } std::shared_ptr<X> p9(ap()); // { dg-error "here" }
// { dg-error "incomplete" "" { target *-*-* } 307 } // { dg-error "incomplete" "" { target *-*-* } 307 }
......
...@@ -25,5 +25,5 @@ ...@@ -25,5 +25,5 @@
void test01() void test01()
{ {
std::shared_ptr<void> p((void*)nullptr); // { dg-error "here" } std::shared_ptr<void> p((void*)nullptr); // { dg-error "here" }
// { dg-error "incomplete" "" { target *-*-* } 778 } // { dg-error "incomplete" "" { target *-*-* } 811 }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment