summaryrefslogtreecommitdiff
path: root/gruel
diff options
context:
space:
mode:
Diffstat (limited to 'gruel')
-rw-r--r--gruel/CMakeLists.txt2
-rw-r--r--gruel/src/include/gruel/pmt.h19
-rw-r--r--gruel/src/lib/pmt/pmt.cc14
-rw-r--r--gruel/src/lib/pmt/pmt_int.h9
-rw-r--r--gruel/src/python/CMakeLists.txt2
-rw-r--r--gruel/src/swig/CMakeLists.txt2
-rw-r--r--gruel/src/swig/Makefile.am1
-rw-r--r--gruel/src/swig/gruel_common.i66
-rw-r--r--gruel/src/swig/pmt_swig.i17
9 files changed, 112 insertions, 20 deletions
diff --git a/gruel/CMakeLists.txt b/gruel/CMakeLists.txt
index b33217c14..5fdc2b218 100644
--- a/gruel/CMakeLists.txt
+++ b/gruel/CMakeLists.txt
@@ -35,9 +35,9 @@ GR_REGISTER_COMPONENT("gruel" ENABLE_GRUEL
include(GrMiscUtils)
GR_SET_GLOBAL(GRUEL_INCLUDE_DIRS
- ${Boost_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/src/include
${CMAKE_CURRENT_BINARY_DIR}/src/include
+ ${Boost_INCLUDE_DIRS}
)
########################################################################
diff --git a/gruel/src/include/gruel/pmt.h b/gruel/src/include/gruel/pmt.h
index 58533e54e..f904d37e1 100644
--- a/gruel/src/include/gruel/pmt.h
+++ b/gruel/src/include/gruel/pmt.h
@@ -32,6 +32,7 @@
#include <stdint.h>
#include <iosfwd>
#include <stdexcept>
+#include <boost/function.hpp>
namespace gruel {
class msg_accepter;
@@ -805,6 +806,24 @@ GRUEL_API std::string pmt_serialize_str(pmt_t obj);
*/
GRUEL_API pmt_t pmt_deserialize_str(std::string str);
+/*
+ * ------------------------------------------------------------------------
+ * advanced
+ * ------------------------------------------------------------------------
+ */
+
+#define GRUEL_PMT_HAVE_PMT_SET_DELETER
+
+/*!
+ * Set a deleter function to be called when the PMT dereferences.
+ * User beware! This function is for extremely advanced use.
+ * Use boost bind to bind extra parameters into the deleter function.
+ * Set an empty function type to reset the PMT to the default deleter.
+ * \param obj the pmt object in which to set the deleter function
+ * \param deleter a function that gets an opaque PMT pointer type
+ */
+GRUEL_API void pmt_set_deleter(pmt_t obj, boost::function<void(pmt_base *)> &deleter);
+
} /* namespace pmt */
#include <gruel/pmt_sugar.h>
diff --git a/gruel/src/lib/pmt/pmt.cc b/gruel/src/lib/pmt/pmt.cc
index f9cf6b4bf..57b66b1a4 100644
--- a/gruel/src/lib/pmt/pmt.cc
+++ b/gruel/src/lib/pmt/pmt.cc
@@ -58,7 +58,7 @@ 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; }
+void intrusive_ptr_release(pmt_base* p) { if (--(p->count_) == 0 ) p->deleter_(p); }
pmt_base::~pmt_base()
{
@@ -1383,4 +1383,16 @@ pmt_dump_sizeof()
printf("sizeof(pmt_uniform_vector) = %3zd\n", sizeof(pmt_uniform_vector));
}
+/*
+ * ------------------------------------------------------------------------
+ * advanced
+ * ------------------------------------------------------------------------
+ */
+
+void
+pmt_set_deleter(pmt_t obj, boost::function<void(pmt_base *)> &deleter)
+{
+ obj->deleter_ = (deleter)? deleter : &pmt_base::default_deleter;
+}
+
} /* namespace pmt */
diff --git a/gruel/src/lib/pmt/pmt_int.h b/gruel/src/lib/pmt/pmt_int.h
index 3a5cd382b..745dbc666 100644
--- a/gruel/src/lib/pmt/pmt_int.h
+++ b/gruel/src/lib/pmt/pmt_int.h
@@ -38,8 +38,15 @@ namespace pmt {
class GRUEL_API pmt_base : boost::noncopyable {
mutable boost::detail::atomic_count count_;
+public:
+ static void default_deleter(pmt_base *p){
+ delete p;
+ }
+
+ boost::function<void(pmt_base *)> deleter_;
+
protected:
- pmt_base() : count_(0) {};
+ pmt_base() : count_(0), deleter_(&pmt::pmt_base::default_deleter) {};
virtual ~pmt_base();
public:
diff --git a/gruel/src/python/CMakeLists.txt b/gruel/src/python/CMakeLists.txt
index be5ac956e..13f2111ba 100644
--- a/gruel/src/python/CMakeLists.txt
+++ b/gruel/src/python/CMakeLists.txt
@@ -47,6 +47,6 @@ foreach(py_qa_test_file ${py_qa_test_files})
${CMAKE_BINARY_DIR}/gruel/src/swig
)
set(GR_TEST_TARGET_DEPS gruel gnuradio-core)
- GR_ADD_TEST(${py_qa_test_name} ${PYTHON_EXECUTABLE} ${py_qa_test_file})
+ GR_ADD_TEST(${py_qa_test_name} ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${py_qa_test_file})
endforeach(py_qa_test_file)
endif(ENABLE_TESTING)
diff --git a/gruel/src/swig/CMakeLists.txt b/gruel/src/swig/CMakeLists.txt
index 7d69ee549..6f636fc3f 100644
--- a/gruel/src/swig/CMakeLists.txt
+++ b/gruel/src/swig/CMakeLists.txt
@@ -38,7 +38,7 @@ GR_SWIG_INSTALL(
)
install(
- FILES gr_intrusive_ptr.i pmt_swig.i
+ FILES gr_intrusive_ptr.i pmt_swig.i gruel_common.i
${CMAKE_CURRENT_BINARY_DIR}/pmt_swig_doc.i
DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig
COMPONENT "gruel_swig"
diff --git a/gruel/src/swig/Makefile.am b/gruel/src/swig/Makefile.am
index 9953d5566..ce0a32513 100644
--- a/gruel/src/swig/Makefile.am
+++ b/gruel/src/swig/Makefile.am
@@ -61,6 +61,7 @@ pmt_swig_la_swig_libadd = \
# additional SWIG files to be installed
pmt_swig_swiginclude_headers = \
+ gruel_common.i \
gr_intrusive_ptr.i \
$(TOP_SWIG_DOC_IFILES)
diff --git a/gruel/src/swig/gruel_common.i b/gruel/src/swig/gruel_common.i
new file mode 100644
index 000000000..e4261cbfa
--- /dev/null
+++ b/gruel/src/swig/gruel_common.i
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GRUEL_COMMON_I
+#define GRUEL_COMMON_I
+
+////////////////////////////////////////////////////////////////////////
+// Language independent exception handler
+////////////////////////////////////////////////////////////////////////
+%include exception.i
+
+%exception {
+ try {
+ $action
+ }
+ catch(std::exception &e) {
+ SWIG_exception(SWIG_RuntimeError, e.what());
+ }
+ catch(...) {
+ SWIG_exception(SWIG_RuntimeError, "Unknown exception");
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////
+// Wrapper for python calls that may block
+////////////////////////////////////////////////////////////////////////
+
+/*!
+ * Use GR_PYTHON_BLOCKING_CODE when calling code that blocks.
+ *
+ * The try/catch is to save us from boost::thread::interrupt:
+ * If a thread from the scheduler (or any other boost thread)
+ * is blocking the routine and throws an interrupt exception.
+ */
+%{
+
+#define GR_PYTHON_BLOCKING_CODE(code) { \
+ PyThreadState *_save; \
+ _save = PyEval_SaveThread(); \
+ try{code} \
+ catch(...){PyEval_RestoreThread(_save); throw;} \
+ PyEval_RestoreThread(_save); \
+}
+
+%}
+
+#endif /*GRUEL_COMMON_I*/
diff --git a/gruel/src/swig/pmt_swig.i b/gruel/src/swig/pmt_swig.i
index 0c937edfc..954501863 100644
--- a/gruel/src/swig/pmt_swig.i
+++ b/gruel/src/swig/pmt_swig.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2011 Free Software Foundation, Inc.
+ * Copyright 2011-2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -34,26 +34,13 @@
#include <gruel/pmt.h>
%}
+%include "gruel_common.i"
//load generated python docstrings
%include "pmt_swig_doc.i"
////////////////////////////////////////////////////////////////////////
// Language independent exception handler
////////////////////////////////////////////////////////////////////////
-%include exception.i
-
-%exception {
- try {
- $action
- }
- catch(std::exception &e) {
- SWIG_exception(SWIG_RuntimeError, e.what());
- }
- catch(...) {
- SWIG_exception(SWIG_RuntimeError, "Unknown exception");
- }
-
-}
// Template intrusive_ptr for Swig to avoid dereferencing issues
namespace pmt{