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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to