[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