diff options
author | Paolo Carlini <pcarlini@suse.de> | 2005-11-10 10:46:27 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2005-11-10 10:46:27 +0000 |
commit | 7fd6021841474041dcb492e1f3131777dbb5142c (patch) | |
tree | 0cab4ff3cce12dc732ebb1c739aa20c04981bf1f | |
parent | 720e2f72c3d2a5b538f519da0a5d18173989d8e1 (diff) | |
download | gcc-7fd6021841474041dcb492e1f3131777dbb5142c.zip gcc-7fd6021841474041dcb492e1f3131777dbb5142c.tar.gz gcc-7fd6021841474041dcb492e1f3131777dbb5142c.tar.bz2 |
boost_shared_ptr.h (_Sp_counted_base::release): Optimize by manually inlining weak_release.
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | 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 da33a22..19d2d49 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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> diff --git a/libstdc++-v3/include/tr1/boost_shared_ptr.h b/libstdc++-v3/include/tr1/boost_shared_ptr.h index 345e17f..3eb94fd 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<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> |