summaryrefslogtreecommitdiff
path: root/nptl/DESIGN-barrier.txt
diff options
context:
space:
mode:
Diffstat (limited to 'nptl/DESIGN-barrier.txt')
-rw-r--r--nptl/DESIGN-barrier.txt49
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;
+}
+