Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2015-06-08 14:46:33 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2015-06-08 14:53:54 +0300
commitec0ba4095f9e60057309e6a72e6661170a22a7ee (patch)
tree68ad66cb208599c8dd62d6aa3d81cddbb5df8f2c
parentd63615272cc667d9e64fa1fe86a8be3d60519f2c (diff)
Fix T44979: Crash when rendering with more threads than the system ones
Revert "Nodes: Remove hardcoded BLENDER_MAX_THREADS number of threads" This reverts commit fdc653e8ce77a188138dc707207139c3d1e6b166. The threads override is not affected by the scene, and hence the limit of the threads was not giving correct result. Need to re-consider some things here.
-rw-r--r--source/blender/nodes/intern/node_exec.c3
-rw-r--r--source/blender/nodes/intern/node_exec.h1
-rw-r--r--source/blender/nodes/shader/node_shader_tree.c5
-rw-r--r--source/blender/nodes/texture/node_texture_tree.c7
4 files changed, 6 insertions, 10 deletions
diff --git a/source/blender/nodes/intern/node_exec.c b/source/blender/nodes/intern/node_exec.c
index 07826686634..2347564c696 100644
--- a/source/blender/nodes/intern/node_exec.c
+++ b/source/blender/nodes/intern/node_exec.c
@@ -29,7 +29,6 @@
* \ingroup nodes
*/
-#include <stdlib.h> /* for abort() */
#include "DNA_node_types.h"
@@ -263,7 +262,7 @@ bNodeThreadStack *ntreeGetThreadStack(bNodeTreeExec *exec, int thread)
{
ListBase *lb = &exec->threadstack[thread];
bNodeThreadStack *nts;
- BLI_assert(thread < exec->tot_thread);
+
for (nts = lb->first; nts; nts = nts->next) {
if (!nts->used) {
nts->used = true;
diff --git a/source/blender/nodes/intern/node_exec.h b/source/blender/nodes/intern/node_exec.h
index 8bb8c77a88c..a0023d02295 100644
--- a/source/blender/nodes/intern/node_exec.h
+++ b/source/blender/nodes/intern/node_exec.h
@@ -65,7 +65,6 @@ typedef struct bNodeTreeExec {
int stacksize;
struct bNodeStack *stack; /* socket data stack */
/* only used by material and texture trees to keep one stack for each thread */
- int tot_thread;
ListBase *threadstack; /* one instance of the stack for each thread */
} bNodeTreeExec;
diff --git a/source/blender/nodes/shader/node_shader_tree.c b/source/blender/nodes/shader/node_shader_tree.c
index a49d6ea76da..cd2c6f68726 100644
--- a/source/blender/nodes/shader/node_shader_tree.c
+++ b/source/blender/nodes/shader/node_shader_tree.c
@@ -235,8 +235,7 @@ bNodeTreeExec *ntreeShaderBeginExecTree_internal(bNodeExecContext *context, bNod
exec = ntree_exec_begin(context, ntree, parent_key);
/* allocate the thread stack listbase array */
- exec->tot_thread = BLI_system_thread_count();
- exec->threadstack = MEM_callocN(exec->tot_thread * sizeof(ListBase), "thread stack array");
+ exec->threadstack = MEM_callocN(BLENDER_MAX_THREADS * sizeof(ListBase), "thread stack array");
for (node = exec->nodetree->nodes.first; node; node = node->next)
node->need_exec = 1;
@@ -273,7 +272,7 @@ void ntreeShaderEndExecTree_internal(bNodeTreeExec *exec)
int a;
if (exec->threadstack) {
- for (a = 0; a < exec->tot_thread; a++) {
+ for (a = 0; a < BLENDER_MAX_THREADS; a++) {
for (nts = exec->threadstack[a].first; nts; nts = nts->next)
if (nts->stack) MEM_freeN(nts->stack);
BLI_freelistN(&exec->threadstack[a]);
diff --git a/source/blender/nodes/texture/node_texture_tree.c b/source/blender/nodes/texture/node_texture_tree.c
index 3482227f044..d716c2565c7 100644
--- a/source/blender/nodes/texture/node_texture_tree.c
+++ b/source/blender/nodes/texture/node_texture_tree.c
@@ -232,8 +232,7 @@ bNodeTreeExec *ntreeTexBeginExecTree_internal(bNodeExecContext *context, bNodeTr
exec = ntree_exec_begin(context, ntree, parent_key);
/* allocate the thread stack listbase array */
- exec->tot_thread = BLI_system_thread_count();
- exec->threadstack = MEM_callocN(exec->tot_thread * sizeof(ListBase), "thread stack array");
+ exec->threadstack = MEM_callocN(BLENDER_MAX_THREADS * sizeof(ListBase), "thread stack array");
for (node = exec->nodetree->nodes.first; node; node = node->next)
node->need_exec = 1;
@@ -271,7 +270,7 @@ static void tex_free_delegates(bNodeTreeExec *exec)
bNodeStack *ns;
int th, a;
- for (th = 0; th < exec->tot_thread; th++)
+ for (th = 0; th < BLENDER_MAX_THREADS; th++)
for (nts = exec->threadstack[th].first; nts; nts = nts->next)
for (ns = nts->stack, a = 0; a < exec->stacksize; a++, ns++)
if (ns->data && !ns->is_copy)
@@ -286,7 +285,7 @@ void ntreeTexEndExecTree_internal(bNodeTreeExec *exec)
if (exec->threadstack) {
tex_free_delegates(exec);
- for (a = 0; a < exec->tot_thread; a++) {
+ for (a = 0; a < BLENDER_MAX_THREADS; a++) {
for (nts = exec->threadstack[a].first; nts; nts = nts->next)
if (nts->stack) MEM_freeN(nts->stack);
BLI_freelistN(&exec->threadstack[a]);