From 7fd6021841474041dcb492e1f3131777dbb5142c Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Thu, 10 Nov 2005 10:46:27 +0000 Subject: [PATCH] boost_shared_ptr.h (_Sp_counted_base::release): Optimize by manually inlining weak_release. 2005-11-10 Paolo Carlini Peter Dimov * 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 From-SVN: r106729 --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/tr1/boost_shared_ptr.h | 19 +++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index da33a22e5f1..19d2d49b041 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2005-11-10 Paolo Carlini + Peter Dimov + + * 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 Paolo Carlini Gabriel Dos Reis diff --git a/libstdc++-v3/include/tr1/boost_shared_ptr.h b/libstdc++-v3/include/tr1/boost_shared_ptr.h index 345e17f8785..3eb94fd980b 100644 --- a/libstdc++-v3/include/tr1/boost_shared_ptr.h +++ b/libstdc++-v3/include/tr1/boost_shared_ptr.h @@ -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 _M_less(const shared_ptr<_Tp1>& __rhs) const { return _M_refcount < __rhs._M_refcount; } - template friend class shared_ptr; - template friend class weak_ptr; + template friend class shared_ptr; + template friend class weak_ptr; // friends injected into enclosing namespace and found by ADL: template