25 lines
601 B
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;
|
|
}
|