[Bf-blender-cvs] [4fcd92f6246] functions: Tuple now has a weak reference to its metadata to prevent synchronization overhead
Jacques Lucke
noreply at git.blender.org
Tue Jul 2 18:38:56 CEST 2019
Commit: 4fcd92f62467c768258e75ead4bc2e6aff7e5808
Author: Jacques Lucke
Date: Tue Jul 2 16:31:34 2019 +0200
Branches: functions
https://developer.blender.org/rB4fcd92f62467c768258e75ead4bc2e6aff7e5808
Tuple now has a weak reference to its metadata to prevent synchronization overhead
===================================================================
M source/blender/blenlib/BLI_shared.hpp
M source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
M source/blender/functions/backends/tuple/tuple.hpp
M source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
M source/blender/functions/backends/tuple_call/tuple_call-c.cpp
M source/blender/functions/backends/tuple_call/tuple_call.hpp
===================================================================
diff --git a/source/blender/blenlib/BLI_shared.hpp b/source/blender/blenlib/BLI_shared.hpp
index cce6376d2b3..2fd0ea6884a 100644
--- a/source/blender/blenlib/BLI_shared.hpp
+++ b/source/blender/blenlib/BLI_shared.hpp
@@ -146,6 +146,11 @@ template<typename T> class AutoRefCount {
return m_object;
}
+ T &ref() const
+ {
+ return *m_object;
+ }
+
T *extract_ptr()
{
T *value = m_object;
diff --git a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
index f2a5f619cea..0cd549f0145 100644
--- a/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
+++ b/source/blender/functions/backends/llvm/ir_for_tuple_call.cpp
@@ -11,8 +11,8 @@ static void run_TupleCallBody(TupleCallBody *body,
bool *initialized_in = (bool *)alloca(body->meta_in()->element_amount());
bool *initialized_out = (bool *)alloca(body->meta_out()->element_amount());
- Tuple fn_in(body->meta_in(), data_in, initialized_in, false);
- Tuple fn_out(body->meta_out(), data_out, initialized_out, false);
+ Tuple fn_in(body->meta_in().ref(), data_in, initialized_in, false);
+ Tuple fn_out(body->meta_out().ref(), data_out, initialized_out, false);
fn_in.set_all_initialized();
diff --git a/source/blender/functions/backends/tuple/tuple.hpp b/source/blender/functions/backends/tuple/tuple.hpp
index b0268c5804d..2ac04b0c9f4 100644
--- a/source/blender/functions/backends/tuple/tuple.hpp
+++ b/source/blender/functions/backends/tuple/tuple.hpp
@@ -84,7 +84,7 @@ using SharedTupleMeta = AutoRefCount<TupleMeta>;
class Tuple {
public:
- Tuple(SharedTupleMeta meta) : m_meta(std::move(meta))
+ Tuple(TupleMeta &meta) : m_meta(&meta)
{
m_initialized = (bool *)MEM_calloc_arrayN(m_meta->element_amount(), sizeof(bool), __func__);
m_data = MEM_mallocN(m_meta->size_of_data(), __func__);
@@ -92,12 +92,12 @@ class Tuple {
m_run_destructors = true;
}
- Tuple(SharedTupleMeta meta,
+ Tuple(TupleMeta &meta,
void *data,
bool *initialized,
bool was_initialized = false,
bool run_destructors = true)
- : m_meta(std::move(meta))
+ : m_meta(&meta)
{
BLI_assert(data != nullptr);
BLI_assert(initialized != nullptr);
@@ -110,21 +110,16 @@ class Tuple {
}
}
- Tuple(SharedTupleMeta &meta, void *buffer)
- : Tuple(meta, buffer, (bool *)buffer + meta->size_of_data())
+ Tuple(TupleMeta &meta, void *buffer) : Tuple(meta, buffer, (bool *)buffer + meta.size_of_data())
{
}
- static Tuple &ConstructInBuffer(SharedTupleMeta &meta, void *buffer)
+ static Tuple &ConstructInBuffer(TupleMeta &meta, void *buffer)
{
Tuple *tuple = new (buffer) Tuple(meta, (char *)buffer + sizeof(Tuple));
return *tuple;
}
- Tuple(TypeVector types) : Tuple(SharedTupleMeta::New(types))
- {
- }
-
/* Has to be implemented explicitely in the future. */
Tuple(const Tuple &tuple) = delete;
@@ -407,7 +402,7 @@ class Tuple {
bool *m_initialized;
bool m_owns_mem;
bool m_run_destructors;
- SharedTupleMeta m_meta;
+ TupleMeta *m_meta;
};
inline uint TupleMeta::size_of_full_tuple() const
@@ -418,6 +413,6 @@ inline uint TupleMeta::size_of_full_tuple() const
} /* namespace FN */
#define FN_TUPLE_STACK_ALLOC(name, meta_expr) \
- FN::SharedTupleMeta &name##_meta = (meta_expr); \
- void *name##_buffer = alloca(name##_meta->size_of_data_and_init()); \
+ FN::TupleMeta &name##_meta = (meta_expr); \
+ void *name##_buffer = alloca(name##_meta.size_of_data_and_init()); \
FN::Tuple name(name##_meta, name##_buffer);
diff --git a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
index 59f2af5176a..036df67376c 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -241,12 +241,12 @@ class ExecuteFGraph : public TupleCallBody {
};
#define SETUP_SUB_TUPLES(node_id, body, body_in, body_out) \
- Tuple body_in(body->meta_in(), \
+ Tuple body_in(body->meta_in().ref(), \
storage.node_input_values_ptr(node_id), \
storage.node_input_inits_ptr(node_id), \
true, \
false); \
- Tuple body_out(body->meta_out(), \
+ Tuple body_out(body->meta_out().ref(), \
storage.node_output_values_ptr(node_id), \
storage.node_output_inits_ptr(node_id), \
true, \
diff --git a/source/blender/functions/backends/tuple_call/tuple_call-c.cpp b/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
index 8b79409beca..635bb965b2e 100644
--- a/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
+++ b/source/blender/functions/backends/tuple_call/tuple_call-c.cpp
@@ -29,13 +29,13 @@ FnTupleCallBody FN_tuple_call_get(FnFunction fn_c)
FnTuple FN_tuple_for_input(FnTupleCallBody body_c)
{
- auto tuple = new Tuple(unwrap(body_c)->meta_in());
+ auto tuple = new Tuple(unwrap(body_c)->meta_in().ref());
return wrap(tuple);
}
FnTuple FN_tuple_for_output(FnTupleCallBody body_c)
{
- auto tuple = new Tuple(unwrap(body_c)->meta_out());
+ auto tuple = new Tuple(unwrap(body_c)->meta_out().ref());
return wrap(tuple);
}
@@ -54,8 +54,8 @@ void fn_tuple_prepare_stack(FnTupleCallBody body_c,
char *buf = (char *)buffer;
char *buf_in = buf + 0;
char *buf_out = buf + body->meta_in()->size_of_full_tuple();
- Tuple::ConstructInBuffer(body->meta_in(), buf_in);
- Tuple::ConstructInBuffer(body->meta_out(), buf_out);
+ Tuple::ConstructInBuffer(body->meta_in().ref(), buf_in);
+ Tuple::ConstructInBuffer(body->meta_out().ref(), buf_out);
*fn_in_c = wrap((Tuple *)buf_in);
*fn_out_c = wrap((Tuple *)buf_out);
}
diff --git a/source/blender/functions/backends/tuple_call/tuple_call.hpp b/source/blender/functions/backends/tuple_call/tuple_call.hpp
index 038688ad53a..912f46ac3ff 100644
--- a/source/blender/functions/backends/tuple_call/tuple_call.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple_call.hpp
@@ -166,5 +166,5 @@ class LazyInTupleCallBody : public TupleCallBodyBase {
} /* namespace FN */
#define FN_TUPLE_CALL_ALLOC_TUPLES(body, name_in, name_out) \
- FN_TUPLE_STACK_ALLOC(name_in, body->meta_in()); \
- FN_TUPLE_STACK_ALLOC(name_out, body->meta_out());
+ FN_TUPLE_STACK_ALLOC(name_in, body->meta_in().ref()); \
+ FN_TUPLE_STACK_ALLOC(name_out, body->meta_out().ref());
More information about the Bf-blender-cvs
mailing list