[Bf-blender-cvs] [844b6e39826] master: Nodes: use CacheMutex to protect topology cache

Jacques Lucke noreply at git.blender.org
Tue Dec 20 13:08:47 CET 2022


Commit: 844b6e39826ff62334705307b1e5cc1eb286d298
Author: Jacques Lucke
Date:   Tue Dec 20 13:05:02 2022 +0100
Branches: master
https://developer.blender.org/rB844b6e39826ff62334705307b1e5cc1eb286d298

Nodes: use CacheMutex to protect topology cache

No functional changes are expected.

===================================================================

M	source/blender/blenkernel/BKE_node_runtime.hh
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenkernel/intern/node_runtime.cc
M	source/blender/blenkernel/intern/node_tree_update.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh
index b4b9df32663..4ecc82b7fc3 100644
--- a/source/blender/blenkernel/BKE_node_runtime.hh
+++ b/source/blender/blenkernel/BKE_node_runtime.hh
@@ -5,6 +5,7 @@
 #include <memory>
 #include <mutex>
 
+#include "BLI_cache_mutex.hh"
 #include "BLI_multi_value_map.hh"
 #include "BLI_utility_mixins.hh"
 #include "BLI_vector.hh"
@@ -119,9 +120,8 @@ class bNodeTreeRuntime : NonCopyable, NonMovable {
    * Protects access to all topology cache variables below. This is necessary so that the cache can
    * be updated on a const #bNodeTree.
    */
-  std::mutex topology_cache_mutex;
-  bool topology_cache_is_dirty = true;
-  bool topology_cache_exists = false;
+  CacheMutex topology_cache_mutex;
+  std::atomic<bool> topology_cache_exists = false;
   /**
    * Under some circumstances, it can be useful to use the cached data while editing the
    * #bNodeTree. By default, this is protected against using an assert.
@@ -298,7 +298,7 @@ inline bool topology_cache_is_available(const bNodeTree &tree)
   if (tree.runtime->allow_use_dirty_topology_cache.load() > 0) {
     return true;
   }
-  if (tree.runtime->topology_cache_is_dirty) {
+  if (tree.runtime->topology_cache_mutex.is_dirty()) {
     return false;
   }
   return true;
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 84bf186367b..66c90745110 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -2010,7 +2010,7 @@ bNode *nodeFindNodebyName(bNodeTree *ntree, const char *name)
 void nodeFindNode(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_sockindex)
 {
   *r_node = nullptr;
-  if (!ntree->runtime->topology_cache_is_dirty) {
+  if (ntree->runtime->topology_cache_mutex.is_cached()) {
     bNode *node = &sock->owner_node();
     *r_node = node;
     if (r_sockindex) {
diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc
index 0f0b04f920e..642dfcc0490 100644
--- a/source/blender/blenkernel/intern/node_runtime.cc
+++ b/source/blender/blenkernel/intern/node_runtime.cc
@@ -22,26 +22,6 @@ void preprocess_geometry_node_tree_for_evaluation(bNodeTree &tree_cow)
   blender::nodes::ensure_geometry_nodes_lazy_function_graph(tree_cow);
 }
 
-static void double_checked_lock(std::mutex &mutex, bool &data_is_dirty, FunctionRef<void()> fn)
-{
-  if (!data_is_dirty) {
-    return;
-  }
-  std::lock_guard lock{mutex};
-  if (!data_is_dirty) {
-    return;
-  }
-  fn();
-  data_is_dirty = false;
-}
-
-static void double_checked_lock_with_task_isolation(std::mutex &mutex,
-                                                    bool &data_is_dirty,
-                                                    FunctionRef<void()> fn)
-{
-  double_checked_lock(mutex, data_is_dirty, [&]() { threading::isolate_task(fn); });
-}
-
 static void update_interface_sockets(const bNodeTree &ntree)
 {
   bNodeTreeRuntime &tree_runtime = *ntree.runtime;
@@ -434,37 +414,34 @@ static void update_group_output_node(const bNodeTree &ntree)
 static void ensure_topology_cache(const bNodeTree &ntree)
 {
   bNodeTreeRuntime &tree_runtime = *ntree.runtime;
-  double_checked_lock_with_task_isolation(
-      tree_runtime.topology_cache_mutex, tree_runtime.topology_cache_is_dirty, [&]() {
-        update_interface_sockets(ntree);
-        update_node_vector(ntree);
-        update_link_vector(ntree);
-        update_socket_vectors_and_owner_node(ntree);
-        update_internal_link_inputs(ntree);
-        update_directly_linked_links_and_sockets(ntree);
-        threading::parallel_invoke(
-            tree_runtime.nodes_by_id.size() > 32,
-            [&]() { update_logical_origins(ntree); },
-            [&]() { update_nodes_by_type(ntree); },
-            [&]() { update_sockets_by_identifier(ntree); },
-            [&]() {
-              update_toposort(ntree,
-                              ToposortDirection::LeftToRight,
-                              tree_runtime.toposort_left_to_right,
-                              tree_runtime.has_available_link_cycle);
-            },
-            [&]() {
-              bool dummy;
-              update_toposort(ntree,
-                              ToposortDirection::RightToLeft,
-                              tree_runtime.toposort_right_to_left,
-                              dummy);
-            },
-            [&]() { update_root_frames(ntree); },
-            [&]() { update_direct_frames_childrens(ntree); });
-        update_group_output_node(ntree);
-        tree_runtime.topology_cache_exists = true;
-      });
+  tree_runtime.topology_cache_mutex.ensure([&]() {
+    update_interface_sockets(ntree);
+    update_node_vector(ntree);
+    update_link_vector(ntree);
+    update_socket_vectors_and_owner_node(ntree);
+    update_internal_link_inputs(ntree);
+    update_directly_linked_links_and_sockets(ntree);
+    threading::parallel_invoke(
+        tree_runtime.nodes_by_id.size() > 32,
+        [&]() { update_logical_origins(ntree); },
+        [&]() { update_nodes_by_type(ntree); },
+        [&]() { update_sockets_by_identifier(ntree); },
+        [&]() {
+          update_toposort(ntree,
+                          ToposortDirection::LeftToRight,
+                          tree_runtime.toposort_left_to_right,
+                          tree_runtime.has_available_link_cycle);
+        },
+        [&]() {
+          bool dummy;
+          update_toposort(
+              ntree, ToposortDirection::RightToLeft, tree_runtime.toposort_right_to_left, dummy);
+        },
+        [&]() { update_root_frames(ntree); },
+        [&]() { update_direct_frames_childrens(ntree); });
+    update_group_output_node(ntree);
+    tree_runtime.topology_cache_exists = true;
+  });
 }
 
 }  // namespace blender::bke::node_tree_runtime
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index a49baf11680..2750d6ce0c8 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -51,7 +51,7 @@ enum eNodeTreeChangedFlag {
 static void add_tree_tag(bNodeTree *ntree, const eNodeTreeChangedFlag flag)
 {
   ntree->runtime->changed_flag |= flag;
-  ntree->runtime->topology_cache_is_dirty = true;
+  ntree->runtime->topology_cache_mutex.tag_dirty();
 }
 
 static void add_node_tag(bNodeTree *ntree, bNode *node, const eNodeTreeChangedFlag flag)



More information about the Bf-blender-cvs mailing list