summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/gnuradio/sbuffer.ipp23
-rw-r--r--lib/sbuffer.cpp23
2 files changed, 27 insertions, 19 deletions
diff --git a/include/gnuradio/sbuffer.ipp b/include/gnuradio/sbuffer.ipp
index fa7d0cc..e4ad62a 100644
--- a/include/gnuradio/sbuffer.ipp
+++ b/include/gnuradio/sbuffer.ipp
@@ -36,6 +36,9 @@ struct SBufferImpl
SBufferConfig config;
};
+
+extern GRAS_API void sbuffer_handle_deref(SBufferImpl *impl);
+
inline void intrusive_ptr_add_ref(SBufferImpl *impl)
{
++impl->count;
@@ -45,25 +48,7 @@ inline void intrusive_ptr_release(SBufferImpl *impl)
{
if (--impl->count == 0)
{
- //call the deleter if possible
- boost::shared_ptr<SBufferDeleter> token_deleter = impl->config.token.lock();
- if (token_deleter)
- {
- SBuffer buff;
- buff.reset(impl);
- (*token_deleter)(buff);
- }
- else if (impl->config.deleter)
- {
- SBuffer buff;
- buff.reset(impl);
- impl->config.deleter(buff);
- impl->config.deleter = SBufferDeleter(); //reset deleter, so we dont double delete
- }
- else
- {
- delete impl; //its really dead now
- }
+ sbuffer_handle_deref(impl);
}
}
diff --git a/lib/sbuffer.cpp b/lib/sbuffer.cpp
index eea323b..31e3943 100644
--- a/lib/sbuffer.cpp
+++ b/lib/sbuffer.cpp
@@ -20,6 +20,29 @@
using namespace gnuradio;
+void gnuradio::sbuffer_handle_deref(SBufferImpl *impl)
+{
+ //call the deleter if possible
+ boost::shared_ptr<SBufferDeleter> token_deleter = impl->config.token.lock();
+ if (token_deleter)
+ {
+ SBuffer buff;
+ buff.reset(impl);
+ (*token_deleter)(buff);
+ }
+ else if (impl->config.deleter)
+ {
+ SBuffer buff;
+ buff.reset(impl);
+ impl->config.deleter(buff);
+ impl->config.deleter = SBufferDeleter(); //reset deleter, so we dont double delete
+ }
+ else
+ {
+ delete impl; //its really dead now
+ }
+}
+
SBufferConfig::SBufferConfig(void)
{
memory = NULL;