[Bf-blender-cvs] [a83bc4f] master: Fix an error in new lockfree parallel_range_next_iter_get() helper.
Bastien Montagne
noreply at git.blender.org
Sat May 14 18:06:17 CEST 2016
Commit: a83bc4f59707ab5a09c24f0b04d2d57d03fb2d2b
Author: Bastien Montagne
Date: Sat May 14 18:02:34 2016 +0200
Branches: master
https://developer.blender.org/rBa83bc4f59707ab5a09c24f0b04d2d57d03fb2d2b
Fix an error in new lockfree parallel_range_next_iter_get() helper.
Reading the shared state->iter value after storing it in the 'reference' var could in theory
lead to a race condition setting state->iter value above state->stop, which would be 'deadly'.
This **may** be the cause of T48422, though I was not able to reproduce that issue so far.
===================================================================
M source/blender/blenlib/intern/task.c
===================================================================
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index 2e68e5a..a61b027 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -784,13 +784,13 @@ BLI_INLINE bool parallel_range_next_iter_get(
{
uint32_t n, olditer, previter, newiter;
- if (state->iter >= state->stop) {
+ if (UNLIKELY(state->iter >= state->stop)) {
return false;
}
do {
olditer = state->iter;
- n = min_ii(state->chunk_size, state->stop - state->iter);
+ n = min_ii(state->chunk_size, state->stop - olditer);
newiter = olditer + n;
previter = atomic_cas_uint32((uint32_t *)&state->iter, olditer, newiter);
} while (UNLIKELY(previter != olditer));
More information about the Bf-blender-cvs
mailing list