forked from bartvdbraak/blender
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.
This commit is contained in:
parent
bdb279ec5b
commit
4e0d8ccf96
@ -70,6 +70,7 @@ int BLI_system_thread_count(void); /* gets the number of threads the system can
|
||||
#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);
|
||||
|
@ -113,6 +113,7 @@ static pthread_mutex_t _viewer_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||
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 @@ void BLI_lock_thread(int type)
|
||||
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 @@ void BLI_unlock_thread(int type)
|
||||
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 */
|
||||
|
@ -212,8 +212,15 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
|
||||
/* 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);
|
||||
|
@ -232,8 +232,15 @@ int ntreeTexExecTree(
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user