Lines Matching refs:barrier
292 static inline void util_barrier_init(util_barrier *barrier, unsigned count)
294 pthread_barrier_init(barrier, NULL, count);
297 static inline void util_barrier_destroy(util_barrier *barrier)
299 pthread_barrier_destroy(barrier);
302 static inline bool util_barrier_wait(util_barrier *barrier)
304 return pthread_barrier_wait(barrier) == PTHREAD_BARRIER_SERIAL_THREAD;
318 static inline void util_barrier_init(util_barrier *barrier, unsigned count)
320 barrier->count = count;
321 barrier->waiters = 0;
322 barrier->sequence = 0;
323 (void) mtx_init(&barrier->mutex, mtx_plain);
324 cnd_init(&barrier->condvar);
327 static inline void util_barrier_destroy(util_barrier *barrier)
329 assert(barrier->waiters == 0);
330 mtx_destroy(&barrier->mutex);
331 cnd_destroy(&barrier->condvar);
334 static inline bool util_barrier_wait(util_barrier *barrier)
336 mtx_lock(&barrier->mutex);
338 assert(barrier->waiters < barrier->count);
339 barrier->waiters++;
341 if (barrier->waiters < barrier->count) {
342 uint64_t sequence = barrier->sequence;
345 cnd_wait(&barrier->condvar, &barrier->mutex);
346 } while (sequence == barrier->sequence);
348 barrier->waiters = 0;
349 barrier->sequence++;
350 cnd_broadcast(&barrier->condvar);
353 mtx_unlock(&barrier->mutex);