diff options
Diffstat (limited to 'nptl/DESIGN-barrier.txt')
-rw-r--r-- | nptl/DESIGN-barrier.txt | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/nptl/DESIGN-barrier.txt b/nptl/DESIGN-barrier.txt new file mode 100644 index 0000000000..782377f0c5 --- /dev/null +++ b/nptl/DESIGN-barrier.txt @@ -0,0 +1,49 @@ +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; + + lll_lock(barrier->lock); + if (!--barrier->left) { + barrier->left = barrier->init_count; + barrier->curr_event++; + futex_wake(&barrier->curr_event, INT_MAX) + lll_unlock(barrier->lock); + + return BARRIER_SERIAL_THREAD; + } + + event = barrier->curr_event; + for (;;) { + lll_unlock(barrier->lock); + + futex_wait(&barrier->curr_event, event) + + lll_lock(barrier->lock); + if (event != barrier->curr_event) + break; + } + lll_unlock(barrier->lock); + + return 0; +} + |