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:
authorBastien Montagne <montagne29@wanadoo.fr>2016-05-14 19:02:34 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-05-14 19:06:05 +0300
commita83bc4f59707ab5a09c24f0b04d2d57d03fb2d2b (patch)
treeb0c8943ba54d4539580d905d021d3c5846cc74db
parentb9996a3cc375fa4c60c62ee1c54cee94b289a43f (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.
-rw-r--r--source/blender/blenlib/intern/task.c4
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));