From ca6bb9a194419707d421f19b15184116736276dd Mon Sep 17 00:00:00 2001 From: git Date: Sat, 15 Aug 2009 02:49:48 +0000 Subject: [PATCH] Applied patch c1258.diff from Stephan Bruns (ticket:359) This patch changes pmt_t to use boost intrusive pointers. Patch was modified to apply to new pmt location since the original patch was created, and add missing include file. Signed-off-by: Johnathan Corgan git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11595 221aa14e-8319-0410-a670-987f0aec2ac5 --- gruel/src/include/gruel/pmt.h | 6 ++++-- gruel/src/lib/pmt/pmt.cc | 2 ++ gruel/src/lib/pmt/pmt_int.h | 8 +++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/gruel/src/include/gruel/pmt.h b/gruel/src/include/gruel/pmt.h index de0998b5..caa12209 100644 --- a/gruel/src/include/gruel/pmt.h +++ b/gruel/src/include/gruel/pmt.h @@ -23,7 +23,7 @@ #ifndef INCLUDED_PMT_H #define INCLUDED_PMT_H -#include +#include #include #include #include @@ -50,8 +50,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_t; +typedef boost::intrusive_ptr 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/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc index fbf557be..fd4035f7 100644 --- a/gruel/src/lib/pmt/pmt.cc +++ b/gruel/src/lib/pmt/pmt.cc @@ -56,6 +56,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/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h index 9aac322a..ba865b41 100644 --- a/gruel/src/lib/pmt/pmt_int.h +++ b/gruel/src/lib/pmt/pmt_int.h @@ -24,6 +24,7 @@ #include #include +#include /* * EVERYTHING IN THIS FILE IS PRIVATE TO THE IMPLEMENTATION! @@ -35,8 +36,10 @@ namespace pmt { class pmt_base : boost::noncopyable { + mutable boost::detail::atomic_count count_; + protected: - pmt_base(){}; + pmt_base() : count_(0) {}; virtual ~pmt_base(); public: @@ -66,6 +69,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); -- 2.30.2