while (!pool->shutdown) {
struct lp_cs_tpool_task *task;
+ unsigned iter_per_thread;
while (list_is_empty(&pool->workqueue) && !pool->shutdown)
cnd_wait(&pool->new_work, &pool->m);
task = list_first_entry(&pool->workqueue, struct lp_cs_tpool_task,
list);
- unsigned this_iter = task->iter_start++;
+
+ unsigned this_iter = task->iter_start;
+
+ iter_per_thread = task->iter_per_thread;
+
+ if (task->iter_remainder &&
+ task->iter_start + task->iter_remainder == task->iter_total)
+ iter_per_thread = task->iter_remainder;
+
+ task->iter_start += iter_per_thread;
if (task->iter_start == task->iter_total)
list_del(&task->list);
mtx_unlock(&pool->m);
- task->work(task->data, this_iter, &lmem);
+ for (unsigned i = 0; i < iter_per_thread; i++)
+ task->work(task->data, this_iter + i, &lmem);
+
mtx_lock(&pool->m);
- task->iter_finished++;
+ task->iter_finished += iter_per_thread;
if (task->iter_finished == task->iter_total)
cnd_broadcast(&task->finish);
}
task->work = work;
task->data = data;
task->iter_total = num_iters;
+
+ task->iter_per_thread = num_iters / pool->num_threads;
+ task->iter_remainder = num_iters % pool->num_threads;
+
cnd_init(&task->finish);
mtx_lock(&pool->m);