summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Blum2013-09-05 00:53:21 -0700
committerJosh Blum2013-09-05 00:53:21 -0700
commita7ae7925eb8c393cdec972ed59a1ca0cb48253bd (patch)
tree35fb700245824046e842483c34ddde24edcdcf0f
parenteeb4d1e7e38e98f372ee21936c220ac6a5cb4efb (diff)
downloadsandhi-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.hpp49
-rw-r--r--include/gras/sbuffer.hpp6
-rw-r--r--lib/sbuffer.cpp55
-rw-r--r--tests/jit_factory_test.py25
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()