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_CUSTOM1 3
|
||||||
#define LOCK_RCACHE 4
|
#define LOCK_RCACHE 4
|
||||||
#define LOCK_OPENGL 5
|
#define LOCK_OPENGL 5
|
||||||
|
#define LOCK_NODES 6
|
||||||
|
|
||||||
void BLI_lock_thread(int type);
|
void BLI_lock_thread(int type);
|
||||||
void BLI_unlock_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 _custom1_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static pthread_mutex_t _rcache_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 _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
|
||||||
static pthread_t mainid;
|
static pthread_t mainid;
|
||||||
static int thread_levels= 0; /* threads can be invoked inside threads */
|
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);
|
pthread_mutex_lock(&_rcache_lock);
|
||||||
else if (type==LOCK_OPENGL)
|
else if (type==LOCK_OPENGL)
|
||||||
pthread_mutex_lock(&_opengl_lock);
|
pthread_mutex_lock(&_opengl_lock);
|
||||||
|
else if (type==LOCK_NODES)
|
||||||
|
pthread_mutex_lock(&_nodes_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BLI_unlock_thread(int type)
|
void BLI_unlock_thread(int type)
|
||||||
@ -363,6 +366,8 @@ void BLI_unlock_thread(int type)
|
|||||||
pthread_mutex_unlock(&_rcache_lock);
|
pthread_mutex_unlock(&_rcache_lock);
|
||||||
else if(type==LOCK_OPENGL)
|
else if(type==LOCK_OPENGL)
|
||||||
pthread_mutex_unlock(&_opengl_lock);
|
pthread_mutex_unlock(&_opengl_lock);
|
||||||
|
else if(type==LOCK_NODES)
|
||||||
|
pthread_mutex_unlock(&_nodes_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mutex Locks */
|
/* Mutex Locks */
|
||||||
|
@ -212,8 +212,15 @@ void ntreeShaderExecTree(bNodeTree *ntree, ShadeInput *shi, ShadeResult *shr)
|
|||||||
/* each material node has own local shaderesult, with optional copying */
|
/* each material node has own local shaderesult, with optional copying */
|
||||||
memset(shr, 0, sizeof(ShadeResult));
|
memset(shr, 0, sizeof(ShadeResult));
|
||||||
|
|
||||||
if (!exec)
|
/* ensure execdata is only initialized once */
|
||||||
exec = ntree->execdata = ntreeShaderBeginExecTree(ntree, 1);
|
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);
|
nts= ntreeGetThreadStack(exec, shi->thread);
|
||||||
ntreeExecThreadNodes(exec, nts, &scd, shi->thread);
|
ntreeExecThreadNodes(exec, nts, &scd, shi->thread);
|
||||||
|
@ -232,8 +232,15 @@ int ntreeTexExecTree(
|
|||||||
data.mtex= mtex;
|
data.mtex= mtex;
|
||||||
data.shi= shi;
|
data.shi= shi;
|
||||||
|
|
||||||
if (!exec)
|
/* ensure execdata is only initialized once */
|
||||||
exec = ntreeTexBeginExecTree(nodes, 1);
|
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);
|
nts= ntreeGetThreadStack(exec, thread);
|
||||||
ntreeExecThreadNodes(exec, nts, &data, thread);
|
ntreeExecThreadNodes(exec, nts, &data, thread);
|
||||||
|
Loading…
Reference in New Issue
Block a user