forked from pool/glibc
153 lines
4.1 KiB
Diff
153 lines
4.1 KiB
Diff
|
[BZ #20263]
|
||
|
* nptl/lowlevelrobustlock.c (__lll_robust_timedlock_wait)
|
||
|
[__ASSUME_FUTEX_CLOCK_REALTIME]: Check for timeout from
|
||
|
lll_futex_timed_wait_bitset.
|
||
|
* nptl/tst-robust10.c: New test.
|
||
|
* nptl/Makefile (tests): Add tst-robust10.
|
||
|
|
||
|
Index: glibc-2.23/nptl/Makefile
|
||
|
===================================================================
|
||
|
--- glibc-2.23.orig/nptl/Makefile
|
||
|
+++ glibc-2.23/nptl/Makefile
|
||
|
@@ -288,7 +288,7 @@ tests = tst-typesizes \
|
||
|
tst-initializers1 $(addprefix tst-initializers1-,\
|
||
|
c89 gnu89 c99 gnu99 c11 gnu11) \
|
||
|
tst-bad-schedattr \
|
||
|
- tst-thread_local1 tst-mutex-errorcheck
|
||
|
+ tst-thread_local1 tst-mutex-errorcheck tst-robust10
|
||
|
xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
|
||
|
tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
|
||
|
test-srcs = tst-oddstacklimit
|
||
|
Index: glibc-2.23/nptl/lowlevelrobustlock.c
|
||
|
===================================================================
|
||
|
--- glibc-2.23.orig/nptl/lowlevelrobustlock.c
|
||
|
+++ glibc-2.23/nptl/lowlevelrobustlock.c
|
||
|
@@ -118,8 +118,10 @@ __lll_robust_timedlock_wait (int *futex,
|
||
|
|| !defined lll_futex_timed_wait_bitset)
|
||
|
lll_futex_timed_wait (futex, newval, &rt, private);
|
||
|
#else
|
||
|
- lll_futex_timed_wait_bitset (futex, newval, abstime,
|
||
|
- FUTEX_CLOCK_REALTIME, private);
|
||
|
+ int err = lll_futex_timed_wait_bitset (futex, newval, abstime,
|
||
|
+ FUTEX_CLOCK_REALTIME, private);
|
||
|
+ if (err == -ETIMEDOUT)
|
||
|
+ return -err;
|
||
|
#endif
|
||
|
|
||
|
try:
|
||
|
Index: glibc-2.23/nptl/tst-robust10.c
|
||
|
===================================================================
|
||
|
--- /dev/null
|
||
|
+++ glibc-2.23/nptl/tst-robust10.c
|
||
|
@@ -0,0 +1,110 @@
|
||
|
+/* Test that pthread_mutex_timedlock properly times out.
|
||
|
+ Copyright (C) 2016 Free Software Foundation, Inc.
|
||
|
+ This file is part of the GNU C Library.
|
||
|
+
|
||
|
+ The GNU C Library is free software; you can redistribute it and/or
|
||
|
+ modify it under the terms of the GNU Lesser General Public
|
||
|
+ License as published by the Free Software Foundation; either
|
||
|
+ version 2.1 of the License, or (at your option) any later version.
|
||
|
+
|
||
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
||
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
+ Lesser General Public License for more details.
|
||
|
+
|
||
|
+ You should have received a copy of the GNU Lesser General Public
|
||
|
+ License along with the GNU C Library; if not, see
|
||
|
+ <http://www.gnu.org/licenses/>. */
|
||
|
+
|
||
|
+#include <pthread.h>
|
||
|
+#include <stdio.h>
|
||
|
+#include <stdlib.h>
|
||
|
+#include <string.h>
|
||
|
+#include <errno.h>
|
||
|
+
|
||
|
+pthread_mutex_t mutex;
|
||
|
+
|
||
|
+static void *
|
||
|
+thr (void *arg)
|
||
|
+{
|
||
|
+ struct timespec abstime;
|
||
|
+ clock_gettime (CLOCK_REALTIME, &abstime);
|
||
|
+ abstime.tv_sec += 1;
|
||
|
+ int ret = pthread_mutex_timedlock (&mutex, &abstime);
|
||
|
+ if (ret == 0)
|
||
|
+ {
|
||
|
+ puts ("mutex_timedlock didn't fail");
|
||
|
+ exit (1);
|
||
|
+ }
|
||
|
+ if (ret != ETIMEDOUT)
|
||
|
+ {
|
||
|
+ printf ("mutex_timedlock failed: %s\n", strerror (ret));
|
||
|
+ exit (1);
|
||
|
+ }
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+static int
|
||
|
+do_test (void)
|
||
|
+{
|
||
|
+ pthread_t pt;
|
||
|
+ pthread_mutexattr_t ma;
|
||
|
+
|
||
|
+ if (pthread_mutexattr_init (&ma) != 0)
|
||
|
+ {
|
||
|
+ puts ("mutexattr_init failed");
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+ if (pthread_mutexattr_setrobust_np (&ma, PTHREAD_MUTEX_ROBUST_NP) != 0)
|
||
|
+ {
|
||
|
+ puts ("mutexattr_setrobust failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+ if (pthread_mutex_init (&mutex, &ma))
|
||
|
+ {
|
||
|
+ puts ("mutex_init failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_mutexattr_destroy (&ma))
|
||
|
+ {
|
||
|
+ puts ("mutexattr_destroy failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_mutex_lock (&mutex))
|
||
|
+ {
|
||
|
+ puts ("mutex_lock failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_create (&pt, NULL, thr, NULL))
|
||
|
+ {
|
||
|
+ puts ("pthread_create failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_join (pt, NULL))
|
||
|
+ {
|
||
|
+ puts ("pthread_join failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_mutex_unlock (&mutex))
|
||
|
+ {
|
||
|
+ puts ("mutex_unlock failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ if (pthread_mutex_destroy (&mutex))
|
||
|
+ {
|
||
|
+ puts ("mutex_destroy failed");
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+#define TEST_FUNCTION do_test ()
|
||
|
+#include "../test-skeleton.c"
|