(linenum→info "unix/slp.c:2238")

glibc/2.7/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: }
Syntax (Markdown)