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