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