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-15 22:11:36 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2016-05-15 22:14:40 +0300
commitbb7da630bacf211d9caabdfbe12cdfaa31939a65 (patch)
treee5a6a4e04d7f968ac22a28b393ab79b77a4c8b48
parent23bdcfe560d2cd568b3dd1ba5ff1796d3330b67c (diff)
Fix T48422: Revert "BLI_task: nano-optimizations to BLI_task_parallel_range feature."
There are some serious issues under windows, causing deadlocks somehow (not reproducible under linux so far). Until further investigation over why this happens, better to revert to previous spin-locked behavior. This reverts commits a83bc4f59707ab and 98123ae9168.
-rw-r--r--source/blender/blenlib/intern/task.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index a61b0276700..247f1af846e 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -776,29 +776,23 @@ typedef struct ParallelRangeState {
int iter;
int chunk_size;
+ SpinLock lock;
} ParallelRangeState;
BLI_INLINE bool parallel_range_next_iter_get(
ParallelRangeState * __restrict state,
int * __restrict iter, int * __restrict count)
{
- uint32_t n, olditer, previter, newiter;
-
- if (UNLIKELY(state->iter >= state->stop)) {
- return false;
+ bool result = false;
+ BLI_spin_lock(&state->lock);
+ if (state->iter < state->stop) {
+ *count = min_ii(state->chunk_size, state->stop - state->iter);
+ *iter = state->iter;
+ state->iter += *count;
+ result = true;
}
-
- do {
- olditer = 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));
-
- *iter = previter;
- *count = n;
-
- return (n != 0);
+ BLI_spin_unlock(&state->lock);
+ return result;
}
static void parallel_range_func(
@@ -903,6 +897,7 @@ static void task_parallel_range_ex(
*/
num_tasks = num_threads * 2;
+ BLI_spin_init(&state.lock);
state.start = start;
state.stop = stop;
state.userdata = userdata;
@@ -921,15 +916,16 @@ static void task_parallel_range_ex(
num_tasks = min_ii(num_tasks, (stop - start) / state.chunk_size);
for (i = 0; i < num_tasks; i++) {
- /* Use this pool's pre-allocated tasks. */
- BLI_task_pool_push_from_thread(task_pool,
- parallel_range_func,
- NULL, false,
- TASK_PRIORITY_HIGH, 0);
+ BLI_task_pool_push(task_pool,
+ parallel_range_func,
+ NULL, false,
+ TASK_PRIORITY_HIGH);
}
BLI_task_pool_work_and_wait(task_pool);
BLI_task_pool_free(task_pool);
+
+ BLI_spin_end(&state.lock);
}
/**