diff options
Diffstat (limited to 'python/gras/GRAS_Block.i')
-rw-r--r-- | python/gras/GRAS_Block.i | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/python/gras/GRAS_Block.i b/python/gras/GRAS_Block.i index b6d8fa9..ccd3963 100644 --- a/python/gras/GRAS_Block.i +++ b/python/gras/GRAS_Block.i @@ -18,7 +18,7 @@ %module(directors="1") GRAS_Block -%feature("director"); +%feature("director") BlockPython; %{ #include <gras/block.hpp> @@ -31,6 +31,63 @@ %include <gras/block.hpp> %include <PMC/PMC.i> + +//////////////////////////////////////////////////////////////////////// +// Make a special block with safe overloads +//////////////////////////////////////////////////////////////////////// + +%inline %{ + +namespace gras +{ + +struct BlockPython : Block +{ + BlockPython(const std::string &name): + Block(name) + { + //NOP + } + + int work + ( + const InputItems &input_items, + const OutputItems &output_items + ) + { + PyGILState_STATE s; + s = PyGILState_Ensure(); + int ret = 0; + try + { + ret = this->python_work(input_items, output_items); + } + catch(...) + { + PyGILState_Release(s); + throw; + } + PyGILState_Release(s); + return ret; + } + + virtual int python_work + ( + const InputItems &input_items, + const OutputItems &output_items + ) + { + throw std::runtime_error("Error in BlockPython::python_work: SWIG directors issue?"); + } +}; + +} + +%} + +//////////////////////////////////////////////////////////////////////// +// Python overload for adding pythonic interfaces +//////////////////////////////////////////////////////////////////////// %pythoncode %{ import numpy @@ -39,21 +96,24 @@ def sig_to_dtype_sig(sig): if sig is None: sig = () return map(numpy.dtype, sig) -class BlockPython(Block): +class Block(BlockPython): def __init__(self, name='Block', in_sig=None, out_sig=None): - Block.__init__(self, name) + BlockPython.__init__(self, name) self.set_input_signature(in_sig) self.set_output_signature(in_sig) def set_input_signature(self, sig): self.__in_sig = sig_to_dtype_sig(sig) - Block.set_input_signature(self, IOSignature([s.itemsize for s in self.__in_sig])) + BlockPython.set_input_signature(self, IOSignature([s.itemsize for s in self.__in_sig])) def set_output_signature(self, sig): self.__out_sig = sig_to_dtype_sig(sig) - Block.set_output_signature(self, IOSignature([s.itemsize for s in self.__out_sig])) + BlockPython.set_output_signature(self, IOSignature([s.itemsize for s in self.__out_sig])) def input_signature(self): return self.__in_sig def output_signature(self): return self.__out_sig + def python_work(self, input_items, output_items): + print 'python work called' + %} |