diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2016-05-14 19:02:34 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2016-05-14 19:06:05 +0300 |
commit | a83bc4f59707ab5a09c24f0b04d2d57d03fb2d2b (patch) | |
tree | b0c8943ba54d4539580d905d021d3c5846cc74db /source | |
parent | b9996a3cc375fa4c60c62ee1c54cee94b289a43f (diff) |
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.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/intern/task.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c index 2e68e5a592f..a61b0276700 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)); |