]> sourceware.org Git - glibc.git/blame - nptl/DESIGN-barrier.txt
Update.
[glibc.git] / nptl / DESIGN-barrier.txt
CommitLineData
76a50749
UD
1Barriers pseudocode
2===================
3
37c054c7 4 int pthread_barrier_wait(barrier_t *barrier);
76a50749
UD
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;
37c054c7 24 result = 0;
76a50749
UD
25
26 lll_lock(barrier->lock);
27 if (!--barrier->left) {
76a50749
UD
28 barrier->curr_event++;
29 futex_wake(&barrier->curr_event, INT_MAX)
76a50749 30
37c054c7
UD
31 result = BARRIER_SERIAL_THREAD;
32 } else {
33 event = barrier->curr_event;
33ab3b66 34 lll_unlock(barrier->lock);
37c054c7 35 do {
37c054c7 36 futex_wait(&barrier->curr_event, event)
37c054c7 37 } while (event == barrier->curr_event);
76a50749 38 }
76a50749 39
37c054c7
UD
40 if (atomic_exchange_and_add (barrier->left, 1) == barrier->init_count - 1)
41 lll_unlock(barrier->lock);
76a50749 42
37c054c7
UD
43 return result;
44}
This page took 0.093972 seconds and 5 git commands to generate.