[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