[Bf-blender-cvs] [e355b47] depsgraph_cleanup: Depsgraph: Use GHash for the id map

Sergey Sharybin noreply at git.blender.org
Thu May 26 18:03:59 CEST 2016


Commit: e355b47740d449036c410891584ee3a5c05a048f
Author: Sergey Sharybin
Date:   Thu May 26 14:33:09 2016 +0200
Branches: depsgraph_cleanup
https://developer.blender.org/rBe355b47740d449036c410891584ee3a5c05a048f

Depsgraph: Use GHash for the id map

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

M	source/blender/depsgraph/intern/builder/deg_builder.cc
M	source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M	source/blender/depsgraph/intern/depsgraph.cc
M	source/blender/depsgraph/intern/depsgraph.h
M	source/blender/depsgraph/intern/depsgraph_debug.cc
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/depsgraph/util/deg_util_map.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index f9b8768..fddf0e4 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -35,6 +35,9 @@
 
 #include "DNA_anim_types.h"
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
 #include "intern/depsgraph.h"
 #include "intern/depsgraph_types.h"
 #include "intern/nodes/deg_node.h"
@@ -105,11 +108,9 @@ void deg_graph_build_finalize(Depsgraph *graph)
 	}
 
 	/* Re-tag IDs for update if it was tagged before the relations update tag. */
-	for (Depsgraph::IDNodeMap::const_iterator it = graph->id_hash.begin();
-	     it != graph->id_hash.end();
-	     ++it)
-	{
-		IDDepsNode *id_node = it->second;
+	GHashIterator gh_iter;
+	GHASH_ITER (gh_iter, graph->id_hash) {
+		IDDepsNode *id_node = reinterpret_cast<IDDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 		ID *id = id_node->id;
 		if (id->tag & LIB_TAG_ID_RECALC_ALL &&
 		    id->tag & LIB_TAG_DOIT)
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index dc2328c..2bef309 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -30,6 +30,9 @@
  * Implementation of tools for debugging the depsgraph
  */
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
 extern "C" {
 #include "DNA_listBase.h"
 
@@ -521,11 +524,9 @@ static void deg_debug_graphviz_graph_nodes(const DebugContext &ctx,
 	if (graph->root_node) {
 		deg_debug_graphviz_node(ctx, graph->root_node);
 	}
-	for (Depsgraph::IDNodeMap::const_iterator it = graph->id_hash.begin();
-	     it != graph->id_hash.end();
-	     ++it)
-	{
-		DepsNode *node = it->second;
+	GHashIterator gh_iter;
+	GHASH_ITER (gh_iter, graph->id_hash) {
+		DepsNode *node = reinterpret_cast<DepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 		deg_debug_graphviz_node(ctx, node);
 	}
 	TimeSourceDepsNode *time_source = graph->find_time_source(NULL);
@@ -537,11 +538,9 @@ static void deg_debug_graphviz_graph_nodes(const DebugContext &ctx,
 static void deg_debug_graphviz_graph_relations(const DebugContext &ctx,
                                                const Depsgraph *graph)
 {
-	for (Depsgraph::IDNodeMap::const_iterator it = graph->id_hash.begin();
-	     it != graph->id_hash.end();
-	     ++it)
-	{
-		IDDepsNode *id_node = it->second;
+	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)
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 191f68f..b3c26b9 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -36,6 +36,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 
 extern "C" {
@@ -72,6 +74,7 @@ Depsgraph::Depsgraph()
     layers(0)
 {
 	BLI_spin_init(&lock);
+	id_hash = BLI_ghash_ptr_new("depsgraph id hash");
 }
 
 Depsgraph::~Depsgraph()
@@ -79,6 +82,7 @@ Depsgraph::~Depsgraph()
 	/* Free root node - it won't have been freed yet... */
 	clear_id_nodes();
 	clear_subgraph_nodes();
+	BLI_ghash_free(id_hash, NULL, NULL);
 	if (this->root_node != NULL) {
 		OBJECT_GUARDED_DELETE(this->root_node, RootDepsNode);
 	}
@@ -309,8 +313,7 @@ void Depsgraph::clear_subgraph_nodes()
 
 IDDepsNode *Depsgraph::find_id_node(const ID *id) const
 {
-	IDNodeMap::const_iterator it = this->id_hash.find(id);
-	return it != this->id_hash.end() ? it->second : NULL;
+	return reinterpret_cast<IDDepsNode *>(BLI_ghash_lookup(id_hash, id));
 }
 
 IDDepsNode *Depsgraph::add_id_node(ID *id, const string &name)
@@ -321,7 +324,7 @@ IDDepsNode *Depsgraph::add_id_node(ID *id, const string &name)
 		id_node = (IDDepsNode *)factory->create_node(id, "", name);
 		id->tag |= LIB_TAG_DOIT;
 		/* register */
-		this->id_hash[id] = id_node;
+		BLI_ghash_insert(id_hash, id, id_node);
 	}
 	return id_node;
 }
@@ -331,21 +334,19 @@ void Depsgraph::remove_id_node(const ID *id)
 	IDDepsNode *id_node = find_id_node(id);
 	if (id_node) {
 		/* unregister */
-		this->id_hash.erase(id);
+		BLI_ghash_remove(id_hash, id, NULL, NULL);
 		OBJECT_GUARDED_DELETE(id_node, IDDepsNode);
 	}
 }
 
 void Depsgraph::clear_id_nodes()
 {
-	for (IDNodeMap::const_iterator it = id_hash.begin();
-	     it != id_hash.end();
-	     ++it)
-	{
-		IDDepsNode *id_node = it->second;
+	GHashIterator gh_iter;
+	GHASH_ITER (gh_iter, id_hash) {
+		IDDepsNode *id_node = reinterpret_cast<IDDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 		OBJECT_GUARDED_DELETE(id_node, IDDepsNode);
 	}
-	id_hash.clear();
+	BLI_ghash_clear(id_hash, NULL, NULL);
 }
 
 /* Add new relationship between two nodes. */
@@ -458,7 +459,7 @@ void Depsgraph::clear_all_nodes()
 {
 	clear_id_nodes();
 	clear_subgraph_nodes();
-	id_hash.clear();
+	BLI_ghash_clear(id_hash, NULL, NULL);
 	if (this->root_node) {
 		OBJECT_GUARDED_DELETE(this->root_node, RootDepsNode);
 		root_node = NULL;
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index a02ed0c..cd07f3f 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -40,10 +40,10 @@
 
 #include "intern/depsgraph_types.h"
 
-#include "util/deg_util_map.h"
 #include "util/deg_util_set.h"
 
 struct ID;
+struct GHash;
 struct PointerRNA;
 struct PropertyRNA;
 
@@ -96,7 +96,6 @@ struct DepsRelation {
 
 /* Dependency Graph object */
 struct Depsgraph {
-	typedef unordered_map<const ID *, IDDepsNode *> IDNodeMap;
 	typedef unordered_set<SubgraphDepsNode *> Subgraphs;
 	typedef unordered_set<OperationDepsNode *> EntryTags;
 	typedef vector<OperationDepsNode *> OperationNodes;
@@ -165,7 +164,7 @@ struct Depsgraph {
 
 	/* <ID : IDDepsNode> mapping from ID blocks to nodes representing these blocks
 	 * (for quick lookups). */
-	IDNodeMap id_hash;
+	GHash *id_hash;
 
 	/* "root" node - the one where all evaluation enters from. */
 	RootDepsNode *root_node;
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc b/source/blender/depsgraph/intern/depsgraph_debug.cc
index 8e86211..615bbf7 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cc
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cc
@@ -30,6 +30,9 @@
  * Implementation of tools for debugging the depsgraph
  */
 
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
 extern "C" {
 #include "DNA_scene_types.h"
 
@@ -215,11 +218,9 @@ void DEG_stats_simple(const Depsgraph *graph, size_t *r_outer,
 		size_t tot_outer = 0;
 		size_t tot_rels = 0;
 
-		for (DEG::Depsgraph::IDNodeMap::const_iterator it = deg_graph->id_hash.begin();
-		     it != deg_graph->id_hash.end();
-		     ++it)
-		{
-			DEG::IDDepsNode *id_node = it->second;
+		GHashIterator gh_iter;
+		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();
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc
index a5bbfe1..abdffec 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -314,11 +314,9 @@ void DEG_graph_on_visible_update(Main *bmain, Scene *scene)
 		 * This is mainly needed on file load only, after that updates of invisible objects
 		 * will be stored in the pending list.
 		 */
-		for (DEG::Depsgraph::IDNodeMap::const_iterator it = graph->id_hash.begin();
-		     it != graph->id_hash.end();
-		     ++it)
-		{
-			DEG::IDDepsNode *id_node = it->second;
+		GHashIterator gh_iter;
+		GHASH_ITER (gh_iter, graph->id_hash) {
+			DEG::IDDepsNode *id_node = reinterpret_cast<DEG::IDDepsNode *>(BLI_ghashIterator_getValue(&gh_iter));
 			ID *id = id_node->id;
 			if ((id->tag & LIB_TAG_ID_RECALC_ALL) != 0 ||
 			    (id_node->layers & scene->lay_updated) == 0)
diff --git a/source/blender/depsgraph/util/deg_util_map.h b/source/blender/depsgraph/util/deg_util_map.h
index fc99835..ffc2160 100644
--- a/source/blender/depsgraph/util/deg_util_map.h
+++ b/source/blender/depsgraph/util/deg_util_map.h
@@ -32,8 +32,8 @@
 
 #include <map>
 
-using std::map;
-using std::pair;
+//using std::map;
+//using std::pair;
 
 #if defined(DEG_NO_UNORDERED_MAP)
 #  include <map>




More information about the Bf-blender-cvs mailing list