summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Blum2013-04-03 23:31:34 -0700
committerJosh Blum2013-04-03 23:31:34 -0700
commitc85fe5cb75d32544eb89a573e8df61757a940766 (patch)
treea1e0fb013bb2d31823738f5ab7de7b69316193ed
parent0651aff49ae7e066bc301faeecfbd519c4743849 (diff)
downloadsandhi-c85fe5cb75d32544eb89a573e8df61757a940766.tar.gz
sandhi-c85fe5cb75d32544eb89a573e8df61757a940766.tar.bz2
sandhi-c85fe5cb75d32544eb89a573e8df61757a940766.zip
gras: code cleanup and comments from last commit
-rw-r--r--include/gras/detail/element.hpp25
-rw-r--r--include/gras/element.hpp13
-rw-r--r--lib/element.cpp27
-rw-r--r--python/gras/GRAS_Block.i13
4 files changed, 44 insertions, 34 deletions
diff --git a/include/gras/detail/element.hpp b/include/gras/detail/element.hpp
index 22a63a0..2b97c8f 100644
--- a/include/gras/detail/element.hpp
+++ b/include/gras/detail/element.hpp
@@ -5,37 +5,12 @@
namespace gras
{
- struct WeakElementSharedPtr : WeakElement
- {
- WeakElementSharedPtr(boost::weak_ptr<Element> weak_self)
- {
- _weak_self = weak_self;
- }
- boost::shared_ptr<void> lock(void)
- {
- return _weak_self.lock();
- }
- boost::weak_ptr<Element> _weak_self;
- };
-
template <typename T>
inline Element::Element(const boost::shared_ptr<T> &elem)
{
*this = elem->shared_to_element();
}
- //! Convert a shared ptr of a derived class to an Element
- inline Element &Element::shared_to_element(void)
- {
- try
- {
- if (not this->weak_self)
- this->weak_self.reset(new WeakElementSharedPtr(this->shared_from_this()));
- }
- catch(...){}
- return *this;
- }
-
} //namespace gras
#endif /*INCLUDED_GRAS_DETAIL_ELEMENT_HPP*/
diff --git a/include/gras/element.hpp b/include/gras/element.hpp
index f9a223d..cfaa5e4 100644
--- a/include/gras/element.hpp
+++ b/include/gras/element.hpp
@@ -19,13 +19,22 @@ struct ElementImpl;
typedef boost::shared_ptr<ElementImpl> ElementBase;
+struct Block;
+
+/*!
+ * Weak Element interface class:
+ * Allows internals to get a reference to the container holding an element.
+ * This container could be a shared_ptr or perhaps a Python object.
+ */
struct WeakElement
{
+ //! Lock creates a shared pointer holding a container reference
virtual boost::shared_ptr<void> lock(void) = 0;
};
-struct Block;
-
+/*!
+ * Element is a base class for all topological elements.
+ */
struct GRAS_API Element : ElementBase, boost::enable_shared_from_this<Element>
{
//! Create an empty element
diff --git a/lib/element.cpp b/lib/element.cpp
index 6736011..340bd85 100644
--- a/lib/element.cpp
+++ b/lib/element.cpp
@@ -31,6 +31,33 @@ Element::~Element(void)
//NOP
}
+//! Weak element overload for the case of shared_ptr container
+struct WeakElementSharedPtr : WeakElement
+{
+ WeakElementSharedPtr(boost::weak_ptr<Element> weak_self)
+ {
+ _weak_self = weak_self;
+ }
+ boost::shared_ptr<void> lock(void)
+ {
+ return _weak_self.lock();
+ }
+ boost::weak_ptr<Element> _weak_self;
+};
+
+Element &Element::shared_to_element(void)
+{
+ try
+ {
+ if (not this->weak_self)
+ {
+ this->weak_self.reset(new WeakElementSharedPtr(this->shared_from_this()));
+ }
+ }
+ catch(...){}
+ return *this;
+}
+
ElementImpl::~ElementImpl(void)
{
if (this->executor) this->top_block_cleanup();
diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i
index e18476a..9cd96e2 100644
--- a/python/gras/GRAS_Block.i
+++ b/python/gras/GRAS_Block.i
@@ -122,11 +122,10 @@ struct BlockPython : Block
this->reset();
}
- void _Py_set_ref(PyObject *o)
- {
- std::cout << o->ob_refcnt <<std::endl;
- this->weak_self.reset(new WeakElementPyObject(o));
- }
+ void _Py_init_weak_ref__(PyObject *o)
+ {
+ this->weak_self.reset(new WeakElementPyObject(o));
+ }
void notify_active(void)
{
@@ -242,10 +241,10 @@ def sig_to_dtype_sig(sig):
class Block(BlockPython):
def __init__(self, name='Block', in_sig=None, out_sig=None):
BlockPython.__init__(self, name)
+ self._Py_init_weak_ref__(self)
self.set_input_signature(in_sig)
self.set_output_signature(out_sig)
- self.__prop_registry = dict();
- self._Py_set_ref(self)
+ self.__prop_registry = dict()
def set_input_signature(self, sig):
self.__in_sig = sig_to_dtype_sig(sig)