[BZ #6955]
authorUlrich Drepper <drepper@redhat.com>
Sat, 1 Nov 2008 19:51:41 +0000 (19:51 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sat, 1 Nov 2008 19:51:41 +0000 (19:51 +0000)
2008-11-01  Ulrich Drepper  <drepper@redhat.com>
[BZ #6955]
* pthread_mutex_lock.c: Add support for private PI mutexes.
* pthread_mutex_timedlock.c: Likewise.
* pthread_mutex_trylock.c: Likewise.
* pthread_mutex_unlock.c: Likewise.
Patch mostly by Ben Jackson <ben@ben.com>.

nptl/ChangeLog
nptl/pthread_mutex_lock.c
nptl/pthread_mutex_timedlock.c
nptl/pthread_mutex_trylock.c
nptl/pthread_mutex_unlock.c

index df01334..bc87e2b 100644 (file)
@@ -1,3 +1,12 @@
+2008-11-01  Ulrich Drepper  <drepper@redhat.com>
+
+       [BZ #6955]
+       * pthread_mutex_lock.c: Add support for private PI mutexes.
+       * pthread_mutex_timedlock.c: Likewise.
+       * pthread_mutex_trylock.c: Likewise.
+       * pthread_mutex_unlock.c: Likewise.
+       Patch mostly by Ben Jackson <ben@ben.com>.
+
 2008-10-31  Ulrich Drepper  <drepper@redhat.com>
 
        [BZ #6843]
index ed98dfc..3eb5636 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -269,9 +269,13 @@ __pthread_mutex_lock (mutex)
          {
            /* The mutex is locked.  The kernel will now take care of
               everything.  */
+           int private = (robust
+                          ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
+                          : PTHREAD_MUTEX_PSHARED (mutex));
            INTERNAL_SYSCALL_DECL (__err);
            int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                                     FUTEX_LOCK_PI, 1, 0);
+                                     __lll_private_flag (FUTEX_LOCK_PI,
+                                                         private), 1, 0);
 
            if (INTERNAL_SYSCALL_ERROR_P (e, __err)
                && (INTERNAL_SYSCALL_ERRNO (e, __err) == ESRCH
@@ -327,7 +331,10 @@ __pthread_mutex_lock (mutex)
 
            INTERNAL_SYSCALL_DECL (__err);
            INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                             FUTEX_UNLOCK_PI, 0, 0);
+                             __lll_private_flag (FUTEX_UNLOCK_PI,
+                                                 PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
+),
+                             0, 0);
 
            THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
            return ENOTRECOVERABLE;
index 4bf0efe..8d0db79 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -254,10 +254,15 @@ pthread_mutex_timedlock (mutex, abstime)
            /* The mutex is locked.  The kernel will now take care of
               everything.  The timeout value must be a relative value.
               Convert it.  */
+           int private = (robust
+                          ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
+                          : PTHREAD_MUTEX_PSHARED (mutex));
            INTERNAL_SYSCALL_DECL (__err);
 
            int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                                     FUTEX_LOCK_PI, 1, abstime);
+                                     __lll_private_flag (FUTEX_LOCK_PI,
+                                                         private), 1,
+                                     abstime);
            if (INTERNAL_SYSCALL_ERROR_P (e, __err))
              {
                if (INTERNAL_SYSCALL_ERRNO (e, __err) == ETIMEDOUT)
@@ -331,7 +336,9 @@ pthread_mutex_timedlock (mutex, abstime)
 
            INTERNAL_SYSCALL_DECL (__err);
            INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                             FUTEX_UNLOCK_PI, 0, 0);
+                             __lll_private_flag (FUTEX_UNLOCK_PI,
+                                                 PTHREAD_ROBUST_MUTEX_PSHARED (mutex)),
+                             0, 0);
 
            THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
            return ENOTRECOVERABLE;
index f6e24d4..25029be 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005-2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -231,9 +231,13 @@ __pthread_mutex_trylock (mutex)
 
            /* The mutex owner died.  The kernel will now take care of
               everything.  */
+           int private = (robust
+                          ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
+                          : PTHREAD_MUTEX_PSHARED (mutex));
            INTERNAL_SYSCALL_DECL (__err);
            int e = INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                                     FUTEX_TRYLOCK_PI, 0, 0);
+                                     __lll_private_flag (FUTEX_TRYLOCK_PI,
+                                                         private), 0, 0);
 
            if (INTERNAL_SYSCALL_ERROR_P (e, __err)
                && INTERNAL_SYSCALL_ERRNO (e, __err) == EWOULDBLOCK)
@@ -274,7 +278,9 @@ __pthread_mutex_trylock (mutex)
 
            INTERNAL_SYSCALL_DECL (__err);
            INTERNAL_SYSCALL (futex, __err, 4, &mutex->__data.__lock,
-                             FUTEX_UNLOCK_PI, 0, 0);
+                             __lll_private_flag (FUTEX_UNLOCK_PI,
+                                                 PTHREAD_ROBUST_MUTEX_PSHARED (mutex)),
+                             0, 0);
 
            THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
            return ENOTRECOVERABLE;
index d33d059..a14c43e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005-2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -196,9 +196,13 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
                                                   THREAD_GETMEM (THREAD_SELF,
                                                                  tid)))
        {
+         int robust = mutex->__data.__kind & PTHREAD_MUTEX_ROBUST_NORMAL_NP;
+         int private = (robust
+                        ? PTHREAD_ROBUST_MUTEX_PSHARED (mutex)
+                        : PTHREAD_MUTEX_PSHARED (mutex));
          INTERNAL_SYSCALL_DECL (__err);
          INTERNAL_SYSCALL (futex, __err, 2, &mutex->__data.__lock,
-                           FUTEX_UNLOCK_PI);
+                           __lll_private_flag (FUTEX_UNLOCK_PI, private));
        }
 
       THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);