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