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:
Diffstat (limited to 'source/blender/blenlib/intern/task.c')
-rw-r--r--source/blender/blenlib/intern/task.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/source/blender/blenlib/intern/task.c b/source/blender/blenlib/intern/task.c
index c05634d3062..4c6f27ab359 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;
@@ -816,7 +818,7 @@ static void task_pool_push(
return;
}
}
- /* Do push to a global execution ppol, slowest possible method,
+ /* Do push to a global execution pool, slowest possible method,
* causes quite reasonable amount of threading overhead.
*/
task_scheduler_push(pool->scheduler, task, priority);
@@ -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)