boost_shared_ptr.h (_Sp_counted_base::release): Optimize by manually inlining weak_re...
authorPaolo Carlini <pcarlini@suse.de>
Thu, 10 Nov 2005 10:46:27 +0000 (10:46 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 10 Nov 2005 10:46:27 +0000 (10:46 +0000)
2005-11-10  Paolo Carlini  <pcarlini@suse.de>
    Peter Dimov  <pdimov@mmltd.net>

* include/tr1/boost_shared_ptr.h (_Sp_counted_base::release):
Optimize by manually inlining weak_release.

* include/tr1/boost_shared_ptr.h (_Sp_counted_base::release,
weak_release): Use explicit memory barriers.

Co-Authored-By: Peter Dimov <pdimov@mmltd.net>
From-SVN: r106729

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1/boost_shared_ptr.h

index da33a22e5f154d1cc895fe2dec0851352c1a2109..19d2d49b041a3559ad82a8b75a15cd980e1ca010 100644 (file)
@@ -1,3 +1,12 @@
+2005-11-10  Paolo Carlini  <pcarlini@suse.de>
+           Peter Dimov  <pdimov@mmltd.net>
+
+       * include/tr1/boost_shared_ptr.h (_Sp_counted_base::release):
+       Optimize by manually inlining weak_release.
+
+       * include/tr1/boost_shared_ptr.h (_Sp_counted_base::release,
+       weak_release): Use explicit memory barriers.
+
 2005-11-09  Benjamin Kosnik  <bkoz@redhat.com>
            Paolo Carlini  <pcarlini@suse.de>
             Gabriel Dos Reis  <gdr@integrable-solutions.net>
index 345e17f8785f9075b4fe7dd85ff7a88afaf1398d..3eb94fd980b439ae5c0a4a62856015592ac0fc9d 100644 (file)
@@ -151,9 +151,12 @@ public:
     if (__gnu_cxx::__exchange_and_add(&_M_use_count, -1) == 1)
       {
        dispose();
-       __glibcxx_mutex_lock(_M_mutex);
-       __glibcxx_mutex_unlock(_M_mutex);
-       weak_release();
+       
+       _GLIBCXX_READ_MEM_BARRIER;
+       _GLIBCXX_WRITE_MEM_BARRIER;
+       
+       if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
+         destroy();
       }
   }
 
@@ -168,8 +171,8 @@ public:
   {
     if (__gnu_cxx::__exchange_and_add(&_M_weak_count, -1) == 1)
       {
-       __glibcxx_mutex_lock(_M_mutex);
-       __glibcxx_mutex_unlock(_M_mutex);
+       _GLIBCXX_READ_MEM_BARRIER;
+       _GLIBCXX_WRITE_MEM_BARRIER;
        destroy();
       }
   }
@@ -328,7 +331,7 @@ class weak_count
 {
 private:
 
-  _Sp_counted_base * _M_pi;
+  _Sp_counted_base* _M_pi;
 
   friend class shared_count;
 
@@ -677,8 +680,8 @@ template<typename _Tp>
       _M_less(const shared_ptr<_Tp1>& __rhs) const
       { return _M_refcount < __rhs._M_refcount; }
 
-    template <typename _Tp1> friend class shared_ptr;
-    template <typename _Tp1> friend class weak_ptr;
+    template<typename _Tp1> friend class shared_ptr;
+    template<typename _Tp1> friend class weak_ptr;
 
     // friends injected into enclosing namespace and found by ADL:
     template<typename _Tp1>