diff options
Diffstat (limited to 'source/blender/blenlib/intern/task.c')
-rw-r--r-- | source/blender/blenlib/intern/task.c | 18 |
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) |