1Barriers pseudocode
2===================
3
4    int pthread_barrier_wait(barrier_t *barrier);
5
6struct barrier_t {
7
8   unsigned int lock:
9         - internal mutex
10
11   unsigned int left;
12         - current barrier count, # of threads still needed.
13
14   unsigned int init_count;
15         - number of threads needed for the barrier to continue.
16
17   unsigned int curr_event;
18         - generation count
19}
20
21pthread_barrier_wait(barrier_t *barrier)
22{
23  unsigned int event;
24  result = 0;
25
26  lll_lock(barrier->lock);
27  if (!--barrier->left) {
28    barrier->curr_event++;
29    futex_wake(&barrier->curr_event, INT_MAX)
30
31    result = BARRIER_SERIAL_THREAD;
32  } else {
33    event = barrier->curr_event;
34    lll_unlock(barrier->lock);
35    do {
36      futex_wait(&barrier->curr_event, event)
37    } while (event == barrier->curr_event);
38  }
39
40  if (atomic_increment_val (barrier->left) == barrier->init_count)
41    lll_unlock(barrier->lock);
42
43  return result;
44}
45