about summary refs log tree commit diff
path: root/nptl/DESIGN-barrier.txt
diff options
context:
space:
mode:
authorTorvald Riegel <triegel@redhat.com>2015-06-24 14:37:32 +0200
committerTorvald Riegel <triegel@redhat.com>2016-01-15 21:20:34 +0100
commitb02840bacdefde318d2ad2f920e50785b9b25d69 (patch)
treedcf8ee01d1e4bdb42686d890c1d00bf3249fbcaf /nptl/DESIGN-barrier.txt
parenta3e5b4feeb54cb92657ec2bc6d9be1fcef9e8575 (diff)
downloadglibc-b02840bacdefde318d2ad2f920e50785b9b25d69.tar.gz
glibc-b02840bacdefde318d2ad2f920e50785b9b25d69.tar.xz
glibc-b02840bacdefde318d2ad2f920e50785b9b25d69.zip
New pthread_barrier algorithm to fulfill barrier destruction requirements.
The previous barrier implementation did not fulfill the POSIX requirements
for when a barrier can be destroyed.  Specifically, it was possible that
threads that haven't noticed yet that their round is complete still access
the barrier's memory, and that those accesses can happen after the barrier
has been legally destroyed.
The new algorithm does not have this issue, and it avoids using a lock
internally.
Diffstat (limited to 'nptl/DESIGN-barrier.txt')
-rw-r--r--nptl/DESIGN-barrier.txt44
1 files changed, 0 insertions, 44 deletions
diff --git a/nptl/DESIGN-barrier.txt b/nptl/DESIGN-barrier.txt
deleted file mode 100644
index 23463c6b7e..0000000000
--- a/nptl/DESIGN-barrier.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-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;
-  result = 0;
-
-  lll_lock(barrier->lock);
-  if (!--barrier->left) {
-    barrier->curr_event++;
-    futex_wake(&barrier->curr_event, INT_MAX)
-
-    result = BARRIER_SERIAL_THREAD;
-  } else {
-    event = barrier->curr_event;
-    lll_unlock(barrier->lock);
-    do {
-      futex_wait(&barrier->curr_event, event)
-    } while (event == barrier->curr_event);
-  }
-
-  if (atomic_increment_val (barrier->left) == barrier->init_count)
-    lll_unlock(barrier->lock);
-
-  return result;
-}