microblaze: Update libm-test-ulps
[jlayton/glibc.git] / nptl / DESIGN-barrier.txt
1 Barriers pseudocode
2 ===================
3
4     int pthread_barrier_wait(barrier_t *barrier);
5
6 struct 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
21 pthread_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 }