]>
Commit | Line | Data |
---|---|---|
76a50749 UD |
1 | Barriers pseudocode |
2 | =================== | |
3 | ||
37c054c7 | 4 | int pthread_barrier_wait(barrier_t *barrier); |
76a50749 UD |
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; | |
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 | } |