rt/src/barrier.c

25 lines
601 B
C

#include <rt/barrier.h>
bool rt_barrier_wait(struct rt_barrier *barrier)
{
rt_mutex_lock(&barrier->mutex);
const unsigned int generation = barrier->generation;
++barrier->level;
const bool is_leader = barrier->level == barrier->threshold;
if (is_leader)
{
barrier->level = 0;
++barrier->generation;
rt_cond_broadcast(&barrier->cond);
}
else
{
while (generation == barrier->generation)
{
rt_cond_wait(&barrier->cond, &barrier->mutex);
}
}
rt_mutex_unlock(&barrier->mutex);
return is_leader;
}