[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36642] branches/particles-2010/source/ blender: Fix for memleak in texture nodes.

Lukas Toenne lukas.toenne at googlemail.com
Thu May 12 13:40:59 CEST 2011


Revision: 36642
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36642
Author:   lukastoenne
Date:     2011-05-12 11:40:59 +0000 (Thu, 12 May 2011)
Log Message:
-----------
Fix for memleak in texture nodes. These nodes store their execution stack in the node tree and only update it when the tree is changed or freed. Had removed the EndExec call for uncoupling tree from execution, but this leaves them with unfreed execution data.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/intern/node.c
    branches/particles-2010/source/blender/nodes/composite/node_composite_tree.c
    branches/particles-2010/source/blender/nodes/shader/node_shader_tree.c
    branches/particles-2010/source/blender/nodes/texture/node_texture_tree.c

Modified: branches/particles-2010/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-05-12 11:34:16 UTC (rev 36641)
+++ branches/particles-2010/source/blender/blenkernel/intern/node.c	2011-05-12 11:40:59 UTC (rev 36642)
@@ -889,6 +889,25 @@
 	
 	if(ntree==NULL) return;
 	
+	/* XXX hack! node trees should not store execution graphs at all.
+	 * This should be removed when old tree types no longer require it.
+	 * Currently the execution data for texture nodes remains in the tree
+	 * after execution, until the node tree is updated or freed.
+	 */
+	if (ntree->execdata) {
+		switch (ntree->type) {
+		case NTREE_COMPOSIT:
+			ntreeCompositEndExecTree(ntree->execdata);
+			break;
+		case NTREE_SHADER:
+			ntreeShaderEndExecTree(ntree->execdata);
+			break;
+		case NTREE_TEXTURE:
+			ntreeTexEndExecTree(ntree->execdata);
+			break;
+		}
+	}
+	
 	BKE_free_animdata((ID *)ntree);
 	
 	id_us_min((ID *)ntree->gpd);

Modified: branches/particles-2010/source/blender/nodes/composite/node_composite_tree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/composite/node_composite_tree.c	2011-05-12 11:34:16 UTC (rev 36641)
+++ branches/particles-2010/source/blender/nodes/composite/node_composite_tree.c	2011-05-12 11:40:59 UTC (rev 36642)
@@ -197,6 +197,12 @@
 	bNode *node;
 	bNodeSocket *sock;
 	
+	/* XXX hack: prevent exec data from being generated twice.
+	 * this should be handled by the renderer!
+	 */
+	if (ntree->execdata)
+		return ntree->execdata;
+	
 	exec = ntree_exec_begin(ntree);
 	
 	for(node= exec->nodetree->nodes.first; node; node= node->next) {

Modified: branches/particles-2010/source/blender/nodes/shader/node_shader_tree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/shader/node_shader_tree.c	2011-05-12 11:34:16 UTC (rev 36641)
+++ branches/particles-2010/source/blender/nodes/shader/node_shader_tree.c	2011-05-12 11:40:59 UTC (rev 36642)
@@ -123,6 +123,12 @@
 	bNodeTreeExec *exec;
 	bNode *node;
 	
+	/* XXX hack: prevent exec data from being generated twice.
+	 * this should be handled by the renderer!
+	 */
+	if (ntree->execdata)
+		return ntree->execdata;
+	
 	/* common base initialization */
 	exec = ntree_exec_begin(ntree);
 	

Modified: branches/particles-2010/source/blender/nodes/texture/node_texture_tree.c
===================================================================
--- branches/particles-2010/source/blender/nodes/texture/node_texture_tree.c	2011-05-12 11:34:16 UTC (rev 36641)
+++ branches/particles-2010/source/blender/nodes/texture/node_texture_tree.c	2011-05-12 11:40:59 UTC (rev 36642)
@@ -119,6 +119,12 @@
 	bNodeTreeExec *exec;
 	bNode *node;
 	
+	/* XXX hack: prevent exec data from being generated twice.
+	 * this should be handled by the renderer!
+	 */
+	if (ntree->execdata)
+		return ntree->execdata;
+	
 	/* common base initialization */
 	exec = ntree_exec_begin(ntree);
 	
@@ -210,7 +216,7 @@
 	data.shi= shi;
 	
 	if (!exec)
-		exec = nodes->execdata = ntreeTexBeginExecTree(nodes);
+		exec = ntreeTexBeginExecTree(nodes);
 	
 	nts= ntreeGetThreadStack(exec, thread);
 	ntreeExecThreadNodes(exec, nts, &data, thread);




More information about the Bf-blender-cvs mailing list