[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