From 134b8933fd898fbd6462d1c3c0175e1f8157a27f Mon Sep 17 00:00:00 2001 From: eb <eb@221aa14e-8319-0410-a670-987f0aec2ac5> Date: Wed, 15 Jul 2009 01:33:49 +0000 Subject: pmt performance improvement: Switch from shared_ptr to intrusive_ptr for pmt_t (c1258 from Stefan BrĂ¼ns). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11442 221aa14e-8319-0410-a670-987f0aec2ac5 --- pmt/src/lib/pmt.cc | 2 ++ pmt/src/lib/pmt.h | 6 ++++-- pmt/src/lib/pmt_int.h | 7 ++++++- 3 files changed, 12 insertions(+), 3 deletions(-) (limited to 'pmt/src') diff --git a/pmt/src/lib/pmt.cc b/pmt/src/lib/pmt.cc index b403c23279..315ff1a406 100644 --- a/pmt/src/lib/pmt.cc +++ b/pmt/src/lib/pmt.cc @@ -54,6 +54,8 @@ pmt_base::operator delete(void *p, size_t size) #endif +void intrusive_ptr_add_ref(pmt_base* p) { ++(p->count_); } +void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) delete p; } pmt_base::~pmt_base() { diff --git a/pmt/src/lib/pmt.h b/pmt/src/lib/pmt.h index 24963fee71..d495b17a54 100644 --- a/pmt/src/lib/pmt.h +++ b/pmt/src/lib/pmt.h @@ -23,7 +23,7 @@ #ifndef INCLUDED_PMT_H #define INCLUDED_PMT_H -#include <boost/shared_ptr.hpp> +#include <boost/intrusive_ptr.hpp> #include <boost/any.hpp> #include <complex> #include <string> @@ -48,8 +48,10 @@ class pmt_base; * \brief typedef for shared pointer (transparent reference counting). * See http://www.boost.org/libs/smart_ptr/smart_ptr.htm */ -typedef boost::shared_ptr<pmt_base> pmt_t; +typedef boost::intrusive_ptr<pmt_base> pmt_t; +extern void intrusive_ptr_add_ref(pmt_base*); +extern void intrusive_ptr_release(pmt_base*); class pmt_exception : public std::logic_error { diff --git a/pmt/src/lib/pmt_int.h b/pmt/src/lib/pmt_int.h index a973d30d9e..af22d45159 100644 --- a/pmt/src/lib/pmt_int.h +++ b/pmt/src/lib/pmt_int.h @@ -34,8 +34,10 @@ #define PMT_LOCAL_ALLOCATOR 0 // define to 0 or 1 class pmt_base : boost::noncopyable { + mutable boost::detail::atomic_count count_; + protected: - pmt_base(){}; + pmt_base() : count_(0) {}; virtual ~pmt_base(); public: @@ -65,6 +67,9 @@ public: virtual bool is_c32vector() const { return false; } virtual bool is_c64vector() const { return false; } + friend void intrusive_ptr_add_ref(pmt_base* p); + friend void intrusive_ptr_release(pmt_base* p); + # if (PMT_LOCAL_ALLOCATOR) void *operator new(size_t); void operator delete(void *, size_t); -- cgit v1.2.3