| Barriers pseudocode |
| =================== |
| |
| int pthread_barrier_wait(barrier_t *barrier); |
| |
| struct barrier_t { |
| |
| unsigned int lock: |
| - internal mutex |
| |
| unsigned int left; |
| - current barrier count, # of threads still needed. |
| |
| unsigned int init_count; |
| - number of threads needed for the barrier to continue. |
| |
| unsigned int curr_event; |
| - generation count |
| } |
| |
| pthread_barrier_wait(barrier_t *barrier) |
| { |
| unsigned int event; |
| result = 0; |
| |
| lll_lock(barrier->lock); |
| if (!--barrier->left) { |
| barrier->curr_event++; |
| futex_wake(&barrier->curr_event, INT_MAX) |
| |
| result = BARRIER_SERIAL_THREAD; |
| } else { |
| event = barrier->curr_event; |
| lll_unlock(barrier->lock); |
| do { |
| futex_wait(&barrier->curr_event, event) |
| } while (event == barrier->curr_event); |
| } |
| |
| if (atomic_increment_val (barrier->left) == barrier->init_count) |
| lll_unlock(barrier->lock); |
| |
| return result; |
| } |