]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
shared_ptr_base.h (_Sp_counted_base<_S_single>): Use non-atomic operations.
authorJonathan Wakely <jwakely.gcc@gmail.com>
Mon, 18 Nov 2013 13:52:39 +0000 (13:52 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Mon, 18 Nov 2013 13:52:39 +0000 (13:52 +0000)
* 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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/shared_ptr_base.h
libstdc++-v3/testsuite/20_util/shared_ptr/cons/43820_neg.cc
libstdc++-v3/testsuite/20_util/shared_ptr/cons/void_neg.cc

index 696aca4b06fd125652a60b6c428f18d255d63936..5af235f1c7b23597fafee3d9110ea16e9a6a3216 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        Implement N3762 string_view: a non-owning reference to a string.
index cf90d7a7cb3ae4c7f9846d3c4f8b986e6795e8b2..68ccc9e1150d3fac8ab01a8cfa364bf3ace2b950 100644 (file)
@@ -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>
index db3fcaced525fb768b7bc1cc4756343be22b69e8..01acca53fc8f2782866833e1ef6673b817049168 100644 (file)
@@ -32,7 +32,7 @@ void test01()
 {
   X* px = 0;
   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" }
   // { dg-error "incomplete" "" { target *-*-* } 307 }
index 3fd38cf2e622e88dfe20a01b4028ea055e04bc71..53891597fb32af221304eba851e928bec08b0729 100644 (file)
@@ -25,5 +25,5 @@
 void test01()
 {
   std::shared_ptr<void> p((void*)nullptr);   // { dg-error "here" }
-  // { dg-error "incomplete" "" { target *-*-* } 778 }
+  // { dg-error "incomplete" "" { target *-*-* } 811 }
 }