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:
authorAlexander Gavrilov <angavrilov@gmail.com>2018-12-03 22:55:18 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2018-12-04 14:08:50 +0300
commit01581d4a1eb595f2bb49d4b87aebfa8bd67ceb38 (patch)
tree851b669f25bf9f56a3e57eda9090fa26212e07ac /source/blender/blenlib/intern/task.c
parentc86e828eee8b7e7e0cde4fa211991b6ebac1ff0f (diff)
BLI_task: fix queue in work_and_wait, and support resetting.
To make the pool more usable for running multiple stages of tasks, fix local queue handling in BLI_task_pool_work_and_wait. Specifically, after the wait loop the local queue should be empty, or the wait part of the function contract isn't fulfilled. Instead, check and run any tasks in queue before the wait loop. Also, add a new function that resets the suspended state of the pool.
Diffstat (limited to 'source/blender/blenlib/intern/task.c')
-rw-r--r--source/blender/blenlib/intern/task.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index 047a7c0cc3b..edd588bd68b 100644
--- a/source/blender/blenlib/intern/task.c
+++ b/source/blender/blenlib/intern/task.c
@@ -175,6 +175,7 @@ struct TaskPool {
volatile bool do_work;
volatile bool is_suspended;
+ bool start_suspended;
ListBase suspended_queue;
size_t num_suspended;
@@ -650,6 +651,7 @@ static TaskPool *task_pool_create_ex(TaskScheduler *scheduler,
pool->do_cancel = false;
pool->do_work = false;
pool->is_suspended = is_suspended;
+ pool->start_suspended = is_suspended;
pool->num_suspended = 0;
pool->suspended_queue.first = pool->suspended_queue.last = NULL;
pool->run_in_background = is_background;
@@ -855,6 +857,8 @@ void BLI_task_pool_work_and_wait(TaskPool *pool)
BLI_condition_notify_all(&scheduler->queue_cond);
BLI_mutex_unlock(&scheduler->queue_mutex);
+
+ pool->num_suspended = 0;
}
}
@@ -862,6 +866,8 @@ void BLI_task_pool_work_and_wait(TaskPool *pool)
ASSERT_THREAD_ID(pool->scheduler, pool->thread_id);
+ handle_local_queue(tls, pool->thread_id);
+
BLI_mutex_lock(&pool->num_mutex);
while (pool->num != 0) {
@@ -913,7 +919,15 @@ void BLI_task_pool_work_and_wait(TaskPool *pool)
BLI_mutex_unlock(&pool->num_mutex);
- handle_local_queue(tls, pool->thread_id);
+ BLI_assert(tls->num_local_queue == 0);
+}
+
+void BLI_task_pool_work_wait_and_reset(TaskPool *pool)
+{
+ BLI_task_pool_work_and_wait(pool);
+
+ pool->do_work = false;
+ pool->is_suspended = pool->start_suspended;
}
void BLI_task_pool_cancel(TaskPool *pool)