[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41419] trunk/blender/source/blender: Fix #29084: material/texture nodes crash introduced in 2.60, execdata is being

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Oct 31 18:01:00 CET 2011


Revision: 41419
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41419
Author:   blendix
Date:     2011-10-31 17:00:59 +0000 (Mon, 31 Oct 2011)
Log Message:
-----------
Fix #29084: material/texture nodes crash introduced in 2.60, execdata is being
lazely created but this wasn't done in a thread safe way.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_threads.h
    trunk/blender/source/blender/blenlib/intern/threads.c
    trunk/blender/source/blender/nodes/shader/node_shader_tree.c
    trunk/blender/source/blender/nodes/texture/node_texture_tree.c

Modified: trunk/blender/source/blender/blenlib/BLI_threads.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_threads.h	2011-10-31 16:44:24 UTC (rev 41418)
+++ trunk/blender/source/blender/blenlib/BLI_threads.h	2011-10-31 17:00:59 UTC (rev 41419)
@@ -70,6 +70,7 @@
 #define LOCK_CUSTOM1	3
 #define LOCK_RCACHE		4
 #define LOCK_OPENGL		5
+#define LOCK_NODES		6
 
 void	BLI_lock_thread(int type);
 void	BLI_unlock_thread(int type);

Modified: trunk/blender/source/blender/blenlib/intern/threads.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/threads.c	2011-10-31 16:44:24 UTC (rev 41418)
+++ trunk/blender/source/blender/blenlib/intern/threads.c	2011-10-31 17:00:59 UTC (rev 41419)
@@ -113,6 +113,7 @@
 static pthread_mutex_t _custom1_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
 static pthread_t mainid;
 static int thread_levels= 0;	/* threads can be invoked inside threads */
 
@@ -347,6 +348,8 @@
 		pthread_mutex_lock(&_rcache_lock);
 	else if (type==LOCK_OPENGL)
 		pthread_mutex_lock(&_opengl_lock);
+	else if (type==LOCK_NODES)
+		pthread_mutex_lock(&_nodes_lock);
 }
 
 void BLI_unlock_thread(int type)
@@ -363,6 +366,8 @@
 		pthread_mutex_unlock(&_rcache_lock);
 	else if(type==LOCK_OPENGL)
 		pthread_mutex_unlock(&_opengl_lock);
+	else if(type==LOCK_NODES)
+		pthread_mutex_unlock(&_nodes_lock);
 }
 
 /* Mutex Locks */

Modified: trunk/blender/source/blender/nodes/shader/node_shader_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/node_shader_tree.c	2011-10-31 16:44:24 UTC (rev 41418)
+++ trunk/blender/source/blender/nodes/shader/node_shader_tree.c	2011-10-31 17:00:59 UTC (rev 41419)
@@ -212,8 +212,15 @@
 	/* each material node has own local shaderesult, with optional copying */
 	memset(shr, 0, sizeof(ShadeResult));
 	
-	if (!exec)
-		exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+	/* ensure execdata is only initialized once */
+	if (!exec) {
+		BLI_lock_thread(LOCK_NODES);
+		if(!ntree->execdata)
+			ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
+		BLI_unlock_thread(LOCK_NODES);
+
+		exec = ntree->execdata;
+	}
 	
 	nts= ntreeGetThreadStack(exec, shi->thread);
 	ntreeExecThreadNodes(exec, nts, &scd, shi->thread);

Modified: trunk/blender/source/blender/nodes/texture/node_texture_tree.c
===================================================================
--- trunk/blender/source/blender/nodes/texture/node_texture_tree.c	2011-10-31 16:44:24 UTC (rev 41418)
+++ trunk/blender/source/blender/nodes/texture/node_texture_tree.c	2011-10-31 17:00:59 UTC (rev 41419)
@@ -232,8 +232,15 @@
 	data.mtex= mtex;
 	data.shi= shi;
 	
-	if (!exec)
-		exec = ntreeTexBeginExecTree(nodes, 1);
+	/* ensure execdata is only initialized once */
+	if (!exec) {
+		BLI_lock_thread(LOCK_NODES);
+		if(!nodes->execdata)
+			ntreeTexBeginExecTree(nodes, 1);
+		BLI_unlock_thread(LOCK_NODES);
+
+		exec= nodes->execdata;
+	}
 	
 	nts= ntreeGetThreadStack(exec, thread);
 	ntreeExecThreadNodes(exec, nts, &data, thread);




More information about the Bf-blender-cvs mailing list