This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.20-93-g184ee94
- From: roland at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 17 Oct 2014 21:32:29 -0000
- Subject: GNU C Library master sources branch master updated. glibc-2.20-93-g184ee94
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 184ee94010786a9e0952aff3af39eba1d72287d3 (commit)
from 327ae2570744dabf7f065a6b529d16cc22438603 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=184ee94010786a9e0952aff3af39eba1d72287d3
commit 184ee94010786a9e0952aff3af39eba1d72287d3
Author: Roland McGrath <roland@hack.frob.com>
Date: Fri Oct 17 14:30:16 2014 -0700
NPTL: Conditionalize direct futex syscall uses.
diff --git a/ChangeLog b/ChangeLog
index 51f07f8..6a8bda4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2014-10-17 Roland McGrath <roland@hack.frob.com>
+ * nptl/nptl-init.c (__pthread_initialize_minimal_internal):
+ Conditionalize FUTEX_PRIVATE_FLAG and FUTEX_CLOCK_REALTIME probes
+ on [__NR_futex].
+ * nptl/pthread_mutex_init.c (prio_inherit_missing): New function,
+ broken out of ...
+ (__pthread_mutex_init): ... here. Call it.
+ * nptl/pthread_mutex_lock.c (__pthread_mutex_lock_full):
+ Conditionalize PI cases on [__NR_futex].
+ * nptl/pthread_mutex_timedlock.c (pthread_mutex_timedlock): Likewise.
+ * nptl/pthread_mutex_trylock.c (__pthread_mutex_trylock): Likewise.
+ * nptl/pthread_mutex_unlock.c (__pthread_mutex_unlock_full): Likewise.
+
* nptl/nptl-init.c (sighandler_setxid, __xidcmd): Make definitions
conditional on [SIGSETXID].
(sigcancel_handler): Make definition conditional on [SIGCANCEL].
diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c
index d8154c4..a39ec9a 100644
--- a/nptl/nptl-init.c
+++ b/nptl/nptl-init.c
@@ -329,7 +329,8 @@ __pthread_initialize_minimal_internal (void)
#endif
set_robust_list_not_avail ();
-#ifndef __ASSUME_PRIVATE_FUTEX
+#ifdef __NR_futex
+# ifndef __ASSUME_PRIVATE_FUTEX
/* Private futexes are always used (at least internally) so that
doing the test once this early is beneficial. */
{
@@ -345,8 +346,8 @@ __pthread_initialize_minimal_internal (void)
know the former are not supported. This also means we know the
kernel will return ENOSYS for unknown operations. */
if (THREAD_GETMEM (pd, header.private_futex) != 0)
-#endif
-#ifndef __ASSUME_FUTEX_CLOCK_REALTIME
+# endif
+# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
{
int word = 0;
/* NB: the syscall actually takes six parameters. The last is the
@@ -361,6 +362,7 @@ __pthread_initialize_minimal_internal (void)
if (INTERNAL_SYSCALL_ERRNO (word, err) != ENOSYS)
__set_futex_clock_realtime ();
}
+# endif
#endif
/* Set initial thread's stack block from 0 up to __libc_stack_end.
diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c
index 2b34688..9f28b8d 100644
--- a/nptl/pthread_mutex_init.c
+++ b/nptl/pthread_mutex_init.c
@@ -18,6 +18,7 @@
#include <assert.h>
#include <errno.h>
+#include <stdbool.h>
#include <string.h>
#include <kernel-features.h>
#include "pthreadP.h"
@@ -31,10 +32,26 @@ static const struct pthread_mutexattr default_mutexattr =
};
-#ifndef __ASSUME_FUTEX_LOCK_PI
-static int tpi_supported;
+static bool
+prio_inherit_missing (void)
+{
+#ifdef __NR_futex
+# ifndef __ASSUME_FUTEX_LOCK_PI
+ static int tpi_supported;
+ if (__glibc_unlikely (tpi_supported == 0))
+ {
+ int lock = 0;
+ INTERNAL_SYSCALL_DECL (err);
+ int ret = INTERNAL_SYSCALL (futex, err, 4, &lock, FUTEX_UNLOCK_PI, 0, 0);
+ assert (INTERNAL_SYSCALL_ERROR_P (ret, err));
+ tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
+ }
+ return __glibc_unlikely (tpi_supported < 0);
+# endif
+ return false;
#endif
-
+ return true;
+}
int
__pthread_mutex_init (mutex, mutexattr)
@@ -58,19 +75,8 @@ __pthread_mutex_init (mutex, mutexattr)
break;
case PTHREAD_PRIO_INHERIT << PTHREAD_MUTEXATTR_PROTOCOL_SHIFT:
-#ifndef __ASSUME_FUTEX_LOCK_PI
- if (__glibc_unlikely (tpi_supported == 0))
- {
- int lock = 0;
- INTERNAL_SYSCALL_DECL (err);
- int ret = INTERNAL_SYSCALL (futex, err, 4, &lock, FUTEX_UNLOCK_PI,
- 0, 0);
- assert (INTERNAL_SYSCALL_ERROR_P (ret, err));
- tpi_supported = INTERNAL_SYSCALL_ERRNO (ret, err) == ENOSYS ? -1 : 1;
- }
- if (__glibc_unlikely (tpi_supported < 0))
+ if (__glibc_unlikely (prio_inherit_missing ()))
return ENOTSUP;
-#endif
break;
default:
diff --git a/nptl/pthread_mutex_lock.c b/nptl/pthread_mutex_lock.c
index d94f4c9..6d4acd4 100644
--- a/nptl/pthread_mutex_lock.c
+++ b/nptl/pthread_mutex_lock.c
@@ -276,6 +276,10 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
break;
+ /* The PI support requires the Linux futex system call. If that's not
+ available, pthread_mutex_init should never have allowed the type to
+ be set. So it will get the default case for an invalid type. */
+#ifdef __NR_futex
case PTHREAD_MUTEX_PI_RECURSIVE_NP:
case PTHREAD_MUTEX_PI_ERRORCHECK_NP:
case PTHREAD_MUTEX_PI_NORMAL_NP:
@@ -321,9 +325,9 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
}
int newval = id;
-#ifdef NO_INCR
+# ifdef NO_INCR
newval |= FUTEX_WAITERS;
-#endif
+# endif
oldval = atomic_compare_and_exchange_val_acq (&mutex->__data.__lock,
newval, 0);
@@ -377,9 +381,9 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
incremented which is not correct because the old owner
has to be discounted. If we are not supposed to
increment __nusers we actually have to decrement it here. */
-#ifdef NO_INCR
+# ifdef NO_INCR
--mutex->__data.__nusers;
-#endif
+# endif
return EOWNERDEAD;
}
@@ -409,6 +413,7 @@ __pthread_mutex_lock_full (pthread_mutex_t *mutex)
}
}
break;
+#endif /* __NR_futex. */
case PTHREAD_MUTEX_PP_RECURSIVE_NP:
case PTHREAD_MUTEX_PP_ERRORCHECK_NP:
diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c
index 57644c3..a840f8e 100644
--- a/nptl/pthread_mutex_timedlock.c
+++ b/nptl/pthread_mutex_timedlock.c
@@ -230,6 +230,10 @@ pthread_mutex_timedlock (mutex, abstime)
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
break;
+ /* The PI support requires the Linux futex system call. If that's not
+ available, pthread_mutex_init should never have allowed the type to
+ be set. So it will get the default case for an invalid type. */
+#ifdef __NR_futex
case PTHREAD_MUTEX_PI_RECURSIVE_NP:
case PTHREAD_MUTEX_PI_ERRORCHECK_NP:
case PTHREAD_MUTEX_PI_NORMAL_NP:
@@ -382,6 +386,7 @@ pthread_mutex_timedlock (mutex, abstime)
}
}
break;
+#endif /* __NR_futex. */
case PTHREAD_MUTEX_PP_RECURSIVE_NP:
case PTHREAD_MUTEX_PP_ERRORCHECK_NP:
diff --git a/nptl/pthread_mutex_trylock.c b/nptl/pthread_mutex_trylock.c
index 0867b06..0293d0f 100644
--- a/nptl/pthread_mutex_trylock.c
+++ b/nptl/pthread_mutex_trylock.c
@@ -191,6 +191,10 @@ __pthread_mutex_trylock (mutex)
return 0;
+ /* The PI support requires the Linux futex system call. If that's not
+ available, pthread_mutex_init should never have allowed the type to
+ be set. So it will get the default case for an invalid type. */
+#ifdef __NR_futex
case PTHREAD_MUTEX_PI_RECURSIVE_NP:
case PTHREAD_MUTEX_PI_ERRORCHECK_NP:
case PTHREAD_MUTEX_PI_NORMAL_NP:
@@ -319,6 +323,7 @@ __pthread_mutex_trylock (mutex)
return 0;
}
+#endif /* __NR_futex. */
case PTHREAD_MUTEX_PP_RECURSIVE_NP:
case PTHREAD_MUTEX_PP_ERRORCHECK_NP:
diff --git a/nptl/pthread_mutex_unlock.c b/nptl/pthread_mutex_unlock.c
index 95ae933..8064de0 100644
--- a/nptl/pthread_mutex_unlock.c
+++ b/nptl/pthread_mutex_unlock.c
@@ -158,6 +158,10 @@ __pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr)
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
break;
+ /* The PI support requires the Linux futex system call. If that's not
+ available, pthread_mutex_init should never have allowed the type to
+ be set. So it will get the default case for an invalid type. */
+#ifdef __NR_futex
case PTHREAD_MUTEX_PI_RECURSIVE_NP:
/* Recursive mutex. */
if (mutex->__data.__owner != THREAD_GETMEM (THREAD_SELF, tid))
@@ -245,6 +249,7 @@ __pthread_mutex_unlock_full (pthread_mutex_t *mutex, int decr)
THREAD_SETMEM (THREAD_SELF, robust_head.list_op_pending, NULL);
break;
+#endif /* __NR_futex. */
case PTHREAD_MUTEX_PP_RECURSIVE_NP:
/* Recursive mutex. */
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 12 ++++++++++++
nptl/nptl-init.c | 8 +++++---
nptl/pthread_mutex_init.c | 36 +++++++++++++++++++++---------------
nptl/pthread_mutex_lock.c | 13 +++++++++----
nptl/pthread_mutex_timedlock.c | 5 +++++
nptl/pthread_mutex_trylock.c | 5 +++++
nptl/pthread_mutex_unlock.c | 5 +++++
7 files changed, 62 insertions(+), 22 deletions(-)
hooks/post-receive
--
GNU C Library master sources