From a6803bf56429829e6da5bd9702508190b27df711 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 11 Jun 2015 10:23:52 +0200 Subject: Compositor: Use atomics to update finished tiles progress Integer is not safe for incremental by multiple threads and if one is unlucky enough that could cause progress re[reports to go totally nuts. --- source/blender/compositor/CMakeLists.txt | 1 + source/blender/compositor/SConscript | 1 + source/blender/compositor/intern/COM_ExecutionGroup.cpp | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) (limited to 'source/blender/compositor') diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index c23aa4ec734..0d35d060f5f 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -41,6 +41,7 @@ set(INC ../render/intern/include ../../../extern/clew/include ../../../intern/guardedalloc + ../../../intern/atomic ) set(INC_SYS diff --git a/source/blender/compositor/SConscript b/source/blender/compositor/SConscript index eab40873f64..370600a594e 100644 --- a/source/blender/compositor/SConscript +++ b/source/blender/compositor/SConscript @@ -50,6 +50,7 @@ incs = [ '../render/intern/include', '../windowmanager', '../../../intern/guardedalloc', + '../../../intern/atomic', # data files env['DATA_HEADERS'], diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index 39ffa42e03c..a7f45ffdf81 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -44,6 +44,8 @@ #include "WM_api.h" #include "WM_types.h" +#include "atomic_ops.h" + ExecutionGroup::ExecutionGroup() { this->m_isOutput = false; @@ -382,7 +384,7 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memo if (this->m_chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED) this->m_chunkExecutionStates[chunkNumber] = COM_ES_EXECUTED; - this->m_chunksFinished++; + atomic_add_u(&this->m_chunksFinished, 0); if (memoryBuffers) { for (unsigned int index = 0; index < this->m_cachedMaxReadBufferOffset; index++) { MemoryBuffer *buffer = memoryBuffers[index]; -- cgit v1.2.3