diff options
| -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> |
