/* See LICENSE file for copyright and license details. */ #include "common.h" #ifndef SINGLE_THREADED static void * slaveloop(void *thread_param) { struct thread_data *data = thread_param; void (*action)(struct algorithm *, struct global_data *); size_t index; for (;;) { barrierwait(&data->group->barrier); action = data->global->action; if (!action) break; for (index = data->index; index < data->global->nalgorithms; index += data->group->nthreads + 1U) (*action)(&data->global->algorithms[index], data->global); barrierwait(&data->group->barrier); } return NULL; } #endif void createbarriergroup(struct barrier_group *group_out, size_t count, struct global_data *global) { #ifndef SINGLE_THREADED size_t i; count = MAX(count, 64); group_out->nthreads = count - 1U; group_out->threads = NULL; if (!group_out->nthreads) return; group_out->threads = ecalloc(group_out->nthreads, sizeof(*group_out->threads)); if ((errno = pthread_barrier_init(&group_out->barrier, NULL, (unsigned)count))) eprintf("pthread_barrier_init NULL %u:", (unsigned)count); for (i = 0; i < group_out->nthreads; i++) { group_out->threads[i].group = group_out; group_out->threads[i].global = global; group_out->threads[i].index = i + 1U; errno = pthread_create(&group_out->threads[i].thread, NULL, &slaveloop, &group_out->threads[i]); if (errno) eprintf("pthread_create NULL:"); } #else group_out->nthreads = 0U; group_out->threads = NULL; (void) global; (void) count; #endif }