]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
* sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_barrier):
authorUlrich Drepper <drepper@redhat.com>
Sat, 26 May 2007 16:19:15 +0000 (16:19 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 26 May 2007 16:19:15 +0000 (16:19 +0000)
Add private field.
* sysdeps/unix/sysv/linux/lowlevelbarrier.sym: Add PRIVATE definition.
* pthread_barrier_init.c: Set private flag if pshared and private
futexes are supported.
* sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Use
private field in futex command setup.
* sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Likewise.

nptl/ChangeLog
nptl/pthread_barrier_init.c
nptl/sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S
nptl/sysdeps/unix/sysv/linux/internaltypes.h
nptl/sysdeps/unix/sysv/linux/lowlevelbarrier.sym
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S

index 08626b43052a581914c391bb950bedac86337162..02a83c81bba1ab982cceaadf9b1794cdb6fe3f1e 100644 (file)
@@ -1,3 +1,14 @@
+2007-05-26  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/internaltypes.h (struct pthread_barrier):
+       Add private field.
+       * sysdeps/unix/sysv/linux/lowlevelbarrier.sym: Add PRIVATE definition.
+       * pthread_barrier_init.c: Set private flag if pshared and private
+       futexes are supported.
+       * sysdeps/unix/sysv/linux/i386/i486/pthread_barrier_wait.S: Use
+       private field in futex command setup.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_barrier_wait.S: Likewise.
+
 2007-05-25  Ulrich Drepper  <drepper@redhat.com>
 
        * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Add private futex
index 19e82fa38d260419c7f5a88ff415231fb333d812..8dfc444965c7744c5d1a85d2a147929fe83c8ec0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
 #include <errno.h>
 #include "pthreadP.h"
 #include <lowlevellock.h>
+#include <kernel-features.h>
+
+
+static const struct pthread_barrierattr default_attr =
+  {
+    .pshared = PTHREAD_PROCESS_PRIVATE
+  };
 
 
 int
@@ -33,17 +40,15 @@ pthread_barrier_init (barrier, attr, count)
   if (__builtin_expect (count == 0, 0))
     return EINVAL;
 
-  if (attr != NULL)
-    {
-      struct pthread_barrierattr *iattr;
-
-      iattr = (struct pthread_barrierattr *) attr;
+  struct pthread_barrierattr *iattr
+    = (attr != NULL
+       ? iattr = (struct pthread_barrierattr *) attr
+       : &default_attr);
 
-      if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
-         && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
-       /* Invalid attribute.  */
-       return EINVAL;
-    }
+  if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
+      && __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
+    /* Invalid attribute.  */
+    return EINVAL;
 
   ibarrier = (struct pthread_barrier *) barrier;
 
@@ -53,5 +58,14 @@ pthread_barrier_init (barrier, attr, count)
   ibarrier->init_count = count;
   ibarrier->curr_event = 0;
 
+#ifdef __ASSUME_PRIVATE_FUTEX
+  ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
+                      ? 0 : FUTEX_PRIVATE_FLAG);
+#else
+  ibarrier->private = (iattr->pshared != PTHREAD_PROCESS_PRIVATE
+                      ? 0 : THREAD_GETMEM (THREAD_SELF,
+                                           header.private_futex));
+#endif
+
   return 0;
 }
index fe7a8b9c66d2008feaaf99ae2bc2772f9fe5ae23..29857195f0b48aced2d8768bd0432448a5af520d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -69,7 +69,13 @@ pthread_barrier_wait:
 
        /* Wait for the remaining threads.  The call will return immediately
           if the CURR_EVENT memory has meanwhile been changed.  */
-7:     xorl    %ecx, %ecx              /* movl $FUTEX_WAIT, %ecx */
+7:
+#if FUTEX_WAIT == 0
+       movl    PRIVATE(%ebx), %ecx
+#else
+       movl    $FUTEX_WAIT, %ecx
+       orl     PRIVATE(%ebx), %ecx
+#endif
        xorl    %esi, %esi
 8:     movl    $SYS_futex, %eax
        ENTER_KERNEL
@@ -120,6 +126,7 @@ pthread_barrier_wait:
           so 0x7fffffff is the highest value.  */
        movl    $0x7fffffff, %edx
        movl    $FUTEX_WAKE, %ecx
+       orl     PRIVATE(%ebx), %ecx
        movl    $SYS_futex, %eax
        ENTER_KERNEL
 
index eff932cab231693e1e4d210b382c4c8feb9b33af..a76a4ec6adf5875153b71a513d174001470b1510 100644 (file)
@@ -96,6 +96,7 @@ struct pthread_barrier
   int lock;
   unsigned int left;
   unsigned int init_count;
+  int private;
 };
 
 
index 36e28eb2a621a49010d96ffc1f66c819e8611686..cfe22b0892faa2b2d7aa4b04433bdb0a30956a35 100644 (file)
@@ -9,3 +9,4 @@ CURR_EVENT              offsetof (struct pthread_barrier, curr_event)
 MUTEX                  offsetof (struct pthread_barrier, lock)
 LEFT                   offsetof (struct pthread_barrier, left)
 INIT_COUNT             offsetof (struct pthread_barrier, init_count)
+PRIVATE                        offsetof (struct pthread_barrier, private)
index fa8125dd87fda4bffb5c89a4cbf967d43f8f2adb..63771b3840271561302a71f2862766e4b5318783 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -65,9 +65,10 @@ pthread_barrier_wait:
           if the CURR_EVENT memory has meanwhile been changed.  */
 7:
 #if FUTEX_WAIT == 0
-       xorl    %esi, %esi
+       movl    PRIVATE(%rdi), %esi
 #else
        movl    $FUTEX_WAIT, %esi
+       orl     PRIVATE(%rdi), %esi
 #endif
        xorq    %r10, %r10
 8:     movl    $SYS_futex, %eax
@@ -116,6 +117,7 @@ pthread_barrier_wait:
           so 0x7fffffff is the highest value.  */
        movl    $0x7fffffff, %edx
        movl    $FUTEX_WAKE, %esi
+       orl     PRIVATE(%rdi), %esi
        movl    $SYS_futex, %eax
        syscall