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
This commit is contained in:
Paolo Carlini 2005-11-10 10:46:27 +00:00 committed by Paolo Carlini
parent 720e2f72c3
commit 7fd6021841
2 changed files with 20 additions and 8 deletions

View 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>

View 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>