static void task_pool_num_increase(TaskPool *pool) { BLI_mutex_lock(&pool->num_mutex); pool->num++; BLI_condition_notify_all(&pool->num_cond); BLI_mutex_unlock(&pool->num_mutex); }
static void task_pool_num_decrease(TaskPool *pool, size_t done) { BLI_mutex_lock(&pool->num_mutex); BLI_assert(pool->num >= done); pool->num -= done; if (pool->num == 0) BLI_condition_notify_all(&pool->num_cond); BLI_mutex_unlock(&pool->num_mutex); }
void BLI_task_scheduler_free(TaskScheduler *scheduler) { Task *task; /* stop all waiting threads */ BLI_mutex_lock(&scheduler->queue_mutex); scheduler->do_exit = true; BLI_condition_notify_all(&scheduler->queue_cond); BLI_mutex_unlock(&scheduler->queue_mutex); /* delete threads */ if (scheduler->threads) { int i; for (i = 0; i < scheduler->num_threads; i++) { if (pthread_join(scheduler->threads[i], NULL) != 0) fprintf(stderr, "TaskScheduler failed to join thread %d/%d\n", i, scheduler->num_threads); } MEM_freeN(scheduler->threads); } /* Delete task thread data */ if (scheduler->task_threads) { MEM_freeN(scheduler->task_threads); } /* Delete task memory pool */ if (scheduler->task_mempool) { for (int i = 0; i <= scheduler->num_threads; ++i) { for (int j = 0; j < scheduler->task_mempool[i].num_tasks; ++j) { MEM_freeN(scheduler->task_mempool[i].tasks[j]); } } MEM_freeN(scheduler->task_mempool); } /* delete leftover tasks */ for (task = scheduler->queue.first; task; task = task->next) { task_data_free(task, 0); } BLI_freelistN(&scheduler->queue); /* delete mutex/condition */ BLI_mutex_end(&scheduler->queue_mutex); BLI_condition_end(&scheduler->queue_cond); MEM_freeN(scheduler); }
static void task_pool_num_decrease(TaskPool *pool, size_t done) { BLI_mutex_lock(&pool->num_mutex); BLI_assert(pool->num >= done); pool->num -= done; atomic_sub_z(&pool->currently_running_tasks, done); pool->done += done; if (pool->num == 0) BLI_condition_notify_all(&pool->num_cond); BLI_mutex_unlock(&pool->num_mutex); }