Optimize for kernels which are known to have the vfork syscall.
[glibc/pb-stable.git] / nptl / DESIGN-barrier.txt
blob782377f0c550ac0720ff0fd92587c4208c82bc6c
1 Barriers pseudocode
2 ===================
4     int pthread_barrier_wait(barrier_t * barrier);
6 struct barrier_t {
8    unsigned int lock:
9          - internal mutex
11    unsigned int left;
12          - current barrier count, # of threads still needed.
14    unsigned int init_count;
15          - number of threads needed for the barrier to continue.
17    unsigned int curr_event;
18          - generation count
21 pthread_barrier_wait(barrier_t *barrier)
23   unsigned int event;
25   lll_lock(barrier->lock);
26   if (!--barrier->left) {
27     barrier->left = barrier->init_count;   
28     barrier->curr_event++;
29     futex_wake(&barrier->curr_event, INT_MAX)
30     lll_unlock(barrier->lock);
32     return BARRIER_SERIAL_THREAD;
33   }
35   event = barrier->curr_event;
36   for (;;) {
37     lll_unlock(barrier->lock);
39     futex_wait(&barrier->curr_event, event)
41     lll_lock(barrier->lock);
42     if (event != barrier->curr_event)
43       break;
44   }
45   lll_unlock(barrier->lock);
47   return 0;