[Bf-blender-cvs] [81c3bf4] depsgraph_cleanup: Depsgraph: Use GHash for components in ID node

Sergey Sharybin noreply at git.blender.org
Thu May 26 18:04:02 CEST 2016


Commit: 81c3bf448ad76df4c24f7f90ae5b00f971c809e3
Author: Sergey Sharybin
Date:   Thu May 26 15:40:48 2016 +0200
Branches: depsgraph_cleanup
https://developer.blender.org/rB81c3bf448ad76df4c24f7f90ae5b00f971c809e3

Depsgraph: Use GHash for components in ID node

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

M	source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph_debug.cc
M	source/blender/depsgraph/intern/nodes/deg_node.cc
M	source/blender/depsgraph/intern/nodes/deg_node.h

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

diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index 5b6c5c8..a9f2185 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -365,16 +365,14 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
 		case DEPSNODE_TYPE_ID_REF:
 		{
 			const IDDepsNode *id_node = (const IDDepsNode *)node;
-			if (id_node->components.empty()) {
+			if (BLI_ghash_size(id_node->components) == 0) {
 				deg_debug_graphviz_node_single(ctx, node);
 			}
 			else {
 				deg_debug_graphviz_node_cluster_begin(ctx, node);
-				for (IDDepsNode::ComponentMap::const_iterator it = id_node->components.begin();
-				     it != id_node->components.end();
-				     ++it)
-				{
-					const ComponentDepsNode *comp = it->second;
+				GHashIterator gh_iter;
+				GHASH_ITER (gh_iter, id_node->components) {
+					const ComponentDepsNode *comp = reinterpret_cast<const ComponentDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 					deg_debug_graphviz_node(ctx, comp);
 				}
 				deg_debug_graphviz_node_cluster_end(ctx);
@@ -431,7 +429,7 @@ static bool deg_debug_graphviz_is_cluster(const DepsNode *node)
 		case DEPSNODE_TYPE_ID_REF:
 		{
 			const IDDepsNode *id_node = (const IDDepsNode *)node;
-			return !id_node->components.empty();
+			return BLI_ghash_size(id_node->components) > 0;
 		}
 		case DEPSNODE_TYPE_SUBGRAPH:
 		{
@@ -538,14 +536,12 @@ static void deg_debug_graphviz_graph_relations(const DebugContext &ctx,
 	GHashIterator gh_iter;
 	GHASH_ITER (gh_iter, graph->id_hash) {
 		IDDepsNode *id_node = reinterpret_cast<IDDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
-		for (IDDepsNode::ComponentMap::const_iterator it = id_node->components.begin();
-		     it != id_node->components.end();
-		     ++it)
-		{
-			ComponentDepsNode *comp_node = it->second;
-			GHashIterator gh_iter;
-			GHASH_ITER (gh_iter, comp_node->operations) {
-				OperationDepsNode *op_node = reinterpret_cast<OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
+		GHashIterator gh_comp_iter;
+		GHASH_ITER (gh_comp_iter, id_node->components) {
+			ComponentDepsNode *comp_node = reinterpret_cast<ComponentDepsNode *>(BLI_ghashIterator_getValue(&gh_comp_iter));
+			GHashIterator gh_op_iter;
+			GHASH_ITER (gh_op_iter, comp_node->operations) {
+				OperationDepsNode *op_node = reinterpret_cast<OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_op_iter));
 				deg_debug_graphviz_node_relations(ctx, op_node);
 			}
 		}
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc b/source/blender/depsgraph/intern/depsgraph_debug.cc
index 9d76749..1758b23 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cc
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cc
@@ -222,15 +222,13 @@ void DEG_stats_simple(const Depsgraph *graph, size_t *r_outer,
 		GHASH_ITER (gh_iter, deg_graph->id_hash) {
 			DEG::IDDepsNode *id_node = reinterpret_cast<DEG::IDDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 			tot_outer++;
-			for (DEG::IDDepsNode::ComponentMap::const_iterator it = id_node->components.begin();
-			     it != id_node->components.end();
-			     ++it)
-			{
-				DEG::ComponentDepsNode *comp_node = it->second;
+			GHashIterator gh_comp_iter;
+			GHASH_ITER (gh_iter, id_node->components) {
+				DEG::ComponentDepsNode *comp_node = reinterpret_cast<DEG::ComponentDepsNode *>(BLI_ghashIterator_getValue(&gh_comp_iter));
 				tot_outer++;
-				GHashIterator gh_iter;
-				GHASH_ITER (gh_iter, comp_node->operations) {
-					DEG::OperationDepsNode *op_node = reinterpret_cast<DEG::OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
+				GHashIterator gh_op_iter;
+				GHASH_ITER (gh_op_iter, comp_node->operations) {
+					DEG::OperationDepsNode *op_node = reinterpret_cast<DEG::OperationDepsNode *>(BLI_ghashIterator_getValue(&gh_op_iter));
 					tot_rels += op_node->inlinks.size();
 				}
 			}
diff --git a/source/blender/depsgraph/intern/nodes/deg_node.cc b/source/blender/depsgraph/intern/nodes/deg_node.cc
index a5e9b2d..94a8e60 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node.cc
@@ -34,6 +34,7 @@
 #include <string.h>
 
 #include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 
 extern "C" {
 #include "DNA_ID.h"
@@ -70,7 +71,7 @@ DepsNode::TypeInfo::TypeInfo(eDepsNode_Type type, const char *tname)
 
 DepsNode::DepsNode()
 {
-	this->name[0] = '\0';
+	name[0] = '\0';
 }
 
 DepsNode::~DepsNode()
@@ -140,6 +141,30 @@ static DepsNodeFactoryImpl<TimeSourceDepsNode> DNTI_TIMESOURCE;
 
 /* ID Node ================================================ */
 
+static unsigned int id_deps_node_hash_key(const void *key_v)
+{
+    const IDDepsNode::ComponentIDKey *key =
+            reinterpret_cast<const IDDepsNode::ComponentIDKey *>(key_v);
+    return hash_combine(BLI_ghashutil_uinthash(key->type),
+                        BLI_ghashutil_strhash_p(key->name.c_str()));
+}
+
+static bool id_deps_node_hash_key_cmp(const void *a, const void *b)
+{
+    const IDDepsNode::ComponentIDKey *key_a =
+            reinterpret_cast<const IDDepsNode::ComponentIDKey *>(a);
+    const IDDepsNode::ComponentIDKey *key_b =
+            reinterpret_cast<const IDDepsNode::ComponentIDKey *>(b);
+    return !(*key_a == *key_b);
+}
+
+static void id_deps_node_hash_key_free(void *key_v)
+{
+    typedef IDDepsNode::ComponentIDKey ComponentIDKey;
+    ComponentIDKey *key = reinterpret_cast<ComponentIDKey *>(key_v);
+    OBJECT_GUARDED_DELETE(key, ComponentIDKey);
+}
+
 /* Initialize 'id' node - from pointer data given. */
 void IDDepsNode::init(const ID *id, const string &UNUSED(subdata))
 {
@@ -149,6 +174,10 @@ void IDDepsNode::init(const ID *id, const string &UNUSED(subdata))
 	this->layers = (1 << 20) - 1;
 	this->eval_flags = 0;
 
+	components = BLI_ghash_new(id_deps_node_hash_key,
+	                           id_deps_node_hash_key_cmp,
+	                           "depsgraph id components hash");
+
 	/* NOTE: components themselves are created if/when needed.
 	 * This prevents problems with components getting added
 	 * twice if an ID-Ref needs to be created to house it...
@@ -159,27 +188,27 @@ void IDDepsNode::init(const ID *id, const string &UNUSED(subdata))
 IDDepsNode::~IDDepsNode()
 {
 	clear_components();
+	BLI_ghash_free(components, id_deps_node_hash_key_free, NULL);
 }
 
 ComponentDepsNode *IDDepsNode::find_component(eDepsNode_Type type,
                                               const string &name) const
 {
 	ComponentIDKey key(type, name);
-	ComponentMap::const_iterator it = components.find(key);
-	return it != components.end() ? it->second : NULL;
+	return reinterpret_cast<ComponentDepsNode *>(BLI_ghash_lookup(components, &key));
 }
 
 ComponentDepsNode *IDDepsNode::add_component(eDepsNode_Type type,
                                              const string &name)
 {
-	ComponentIDKey key(type, name);
 	ComponentDepsNode *comp_node = find_component(type, name);
 	if (!comp_node) {
 		DepsNodeFactory *factory = deg_get_node_factory(type);
 		comp_node = (ComponentDepsNode *)factory->create_node(this->id, "", name);
 
 		/* Register. */
-		this->components[key] = comp_node;
+		ComponentIDKey *key = OBJECT_GUARDED_NEW(ComponentIDKey, type, name);
+		BLI_ghash_insert(components, key, comp_node);
 		comp_node->owner = this;
 	}
 	return comp_node;
@@ -187,34 +216,30 @@ ComponentDepsNode *IDDepsNode::add_component(eDepsNode_Type type,
 
 void IDDepsNode::remove_component(eDepsNode_Type type, const string &name)
 {
-	ComponentIDKey key(type, name);
 	ComponentDepsNode *comp_node = find_component(type, name);
 	if (comp_node) {
 		/* Unregister. */
-		this->components.erase(key);
+		ComponentIDKey key(type, name);
+		BLI_ghash_remove(components, &key, id_deps_node_hash_key_free, NULL);
 		OBJECT_GUARDED_DELETE(comp_node, ComponentDepsNode);
 	}
 }
 
 void IDDepsNode::clear_components()
 {
-	for (ComponentMap::const_iterator it = components.begin();
-	     it != components.end();
-	     ++it)
-	{
-		ComponentDepsNode *comp_node = it->second;
+	GHashIterator gh_iter;
+	GHASH_ITER (gh_iter, components) {
+		ComponentDepsNode *comp_node = reinterpret_cast<ComponentDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 		OBJECT_GUARDED_DELETE(comp_node, ComponentDepsNode);
 	}
-	components.clear();
+	BLI_ghash_clear(components, id_deps_node_hash_key_free, NULL);
 }
 
 void IDDepsNode::tag_update(Depsgraph *graph)
 {
-	for (ComponentMap::const_iterator it = components.begin();
-	     it != components.end();
-	     ++it)
-	{
-		ComponentDepsNode *comp_node = it->second;
+	GHashIterator gh_iter;
+	GHASH_ITER (gh_iter, components) {
+		ComponentDepsNode *comp_node = reinterpret_cast<ComponentDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 		/* TODO(sergey): What about drievrs? */
 		bool do_component_tag = comp_node->type != DEPSNODE_TYPE_ANIMATION;
 		if (comp_node->type == DEPSNODE_TYPE_ANIMATION) {
diff --git a/source/blender/depsgraph/intern/nodes/deg_node.h b/source/blender/depsgraph/intern/nodes/deg_node.h
index 2b45769..1092997 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node.h
+++ b/source/blender/depsgraph/intern/nodes/deg_node.h
@@ -37,6 +37,7 @@
 #include "util/deg_util_set.h"
 
 struct ID;
+struct GHash;
 struct Scene;
 
 namespace DEG {
@@ -158,23 +159,6 @@ struct IDDepsNode : public DepsNode {
 		string name;
 	};
 
-	/* XXX can't specialize std::hash for this purpose, because ComponentIDKey is
-	 * a nested type ...
-	 *
-	 *   http://stackoverflow.com/a/951245
-	 */
-	struct component_key_hash {
-		bool operator() (const ComponentIDKey &key) const
-		{
-			return hash_combine(BLI_ghashutil_uinthash(key.type),
-			                    BLI_ghashutil_strhash_p(key.name.c_str()));
-		}
-	};
-
-	typedef unordered_map<ComponentIDKey,
-	                      ComponentDepsNode *,
-	                      component_key_hash> ComponentMap;
-
 	void init(const ID *id, const string &subdata);
 	~IDDepsNode();
 
@@ -191,7 +175,7 @@ struct IDDepsNode : public DepsNode {
 	ID *id;
 
 	/* Hash to make it faster to look up components. */
-	ComponentMap components;
+	GHash *component

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list