diff options
author | Josh Blum | 2013-09-05 00:53:21 -0700 |
---|---|---|
committer | Josh Blum | 2013-09-05 00:53:21 -0700 |
commit | a7ae7925eb8c393cdec972ed59a1ca0cb48253bd (patch) | |
tree | 35fb700245824046e842483c34ddde24edcdcf0f | |
parent | eeb4d1e7e38e98f372ee21936c220ac6a5cb4efb (diff) | |
download | sandhi-a7ae7925eb8c393cdec972ed59a1ca0cb48253bd.tar.gz sandhi-a7ae7925eb8c393cdec972ed59a1ca0cb48253bd.tar.bz2 sandhi-a7ae7925eb8c393cdec972ed59a1ca0cb48253bd.zip |
gras: move sbuffer inlines into lib
This avoids inline ASM to be LLVM JIT friendly.
This commit includes a unit test for jit factory + sbuffer.
-rw-r--r-- | include/gras/detail/sbuffer.hpp | 49 | ||||
-rw-r--r-- | include/gras/sbuffer.hpp | 6 | ||||
-rw-r--r-- | lib/sbuffer.cpp | 55 | ||||
-rw-r--r-- | tests/jit_factory_test.py | 25 |
4 files changed, 90 insertions, 45 deletions
diff --git a/include/gras/detail/sbuffer.hpp b/include/gras/detail/sbuffer.hpp index 720c8db..cdd4191 100644 --- a/include/gras/detail/sbuffer.hpp +++ b/include/gras/detail/sbuffer.hpp @@ -8,57 +8,16 @@ namespace gras { +extern GRAS_API void intrusive_ptr_add_ref(SBufferImpl *impl); +extern GRAS_API void intrusive_ptr_release(SBufferImpl *impl); + struct SBufferImpl { - SBufferImpl(const SBufferConfig &config): - count(0), - config(config) - { - //NOP - } - + SBufferImpl(const SBufferConfig &config); boost::detail::atomic_count count; SBufferConfig config; }; -GRAS_FORCE_INLINE void intrusive_ptr_add_ref(SBufferImpl *impl) -{ - ++impl->count; -} - -GRAS_FORCE_INLINE void intrusive_ptr_release(SBufferImpl *impl) -{ - if GRAS_LIKELY(--impl->count) return; - - //call the deleter if possible - boost::shared_ptr<SBufferDeleter> token_deleter = impl->config.token.lock(); - if GRAS_LIKELY(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 - } -} - -GRAS_FORCE_INLINE SBuffer::SBuffer(void): - offset(0), - length(0), - last(NULL) -{ - //NOP -} - GRAS_FORCE_INLINE const void *SBuffer::get_actual_memory(void) const { return (*this)->config.memory; diff --git a/include/gras/sbuffer.hpp b/include/gras/sbuffer.hpp index 7980c30..d1bc2d1 100644 --- a/include/gras/sbuffer.hpp +++ b/include/gras/sbuffer.hpp @@ -34,6 +34,9 @@ struct GRAS_API SBufferConfig //! Default constructor zeros out buffer config SBufferConfig(void); + //! Destructor + ~SBufferConfig(void); + //! pointer to the memory start void *memory; @@ -94,6 +97,9 @@ struct GRAS_API SBuffer : boost::intrusive_ptr<SBufferImpl> */ SBuffer(const SBufferConfig &config); + //! Destructor + ~SBuffer(void); + /*! * Get a pointer to the start of the underlying memory */ diff --git a/lib/sbuffer.cpp b/lib/sbuffer.cpp index bdf8a6f..04b3092 100644 --- a/lib/sbuffer.cpp +++ b/lib/sbuffer.cpp @@ -6,6 +6,43 @@ using namespace gras; +void gras::intrusive_ptr_add_ref(SBufferImpl *impl) +{ + ++impl->count; +} + +void gras::intrusive_ptr_release(SBufferImpl *impl) +{ + if GRAS_LIKELY(--impl->count) return; + + //call the deleter if possible + boost::shared_ptr<SBufferDeleter> token_deleter = impl->config.token.lock(); + if GRAS_LIKELY(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 + } +} + +SBufferImpl::SBufferImpl(const SBufferConfig &config): + count(0), + config(config) +{ + //NOP +} + SBufferConfig::SBufferConfig(void) { memory = NULL; @@ -14,6 +51,11 @@ SBufferConfig::SBufferConfig(void) user_index = ~0; } +SBufferConfig::~SBufferConfig(void) +{ + //NOP +} + static void numa_mem_deleter(SBuffer &buff) { Theron::Detail::Utils::FreeOnNode(buff.get_actual_memory(), buff.get_actual_length()); @@ -47,6 +89,14 @@ static void default_allocator(SBufferConfig &config) } } +SBuffer::SBuffer(void): + offset(0), + length(0), + last(NULL) +{ + //NOP +} + SBuffer::SBuffer(const SBufferConfig &config): offset(0), length(0) @@ -58,3 +108,8 @@ SBuffer::SBuffer(const SBufferConfig &config): } this->length = this->get_actual_length(); } + +SBuffer::~SBuffer(void) +{ + //NOP +} diff --git a/tests/jit_factory_test.py b/tests/jit_factory_test.py index 326313c..807abf8 100644 --- a/tests/jit_factory_test.py +++ b/tests/jit_factory_test.py @@ -146,5 +146,30 @@ class JITFactoryTest(unittest.TestCase): self.assertEqual(expected_result, actual_result) + def test_jit_compile_special(self): + SOURCE = """ +#include <gras/block.hpp> +#include <gras/factory.hpp> +#include <iostream> + +struct FooBar : gras::Block +{ + FooBar(void): + gras::Block("FooBar") + { + } + + void work(const InputItems &ins, const OutputItems &outs) + { + gras::SBufferConfig c0; + gras::SBuffer b0 = gras::SBuffer(c0); + gras::SBuffer i0 = this->get_input_buffer(0); + } +}; + +GRAS_REGISTER_FACTORY0("/tests/my_foo_bar", FooBar) +""" + gras.jit_factory(SOURCE, ["-O3", "-I"+gras_inc, "-I"+pmc_inc]) + if __name__ == '__main__': unittest.main() |