aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2005-11-10 10:46:27 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2005-11-10 10:46:27 +0000
commit7fd6021841474041dcb492e1f3131777dbb5142c (patch)
tree0cab4ff3cce12dc732ebb1c739aa20c04981bf1f
parent720e2f72c3d2a5b538f519da0a5d18173989d8e1 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--libstdc++-v3/include/tr1/boost_shared_ptr.h19
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>