aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/pthread
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-05-26 00:09:11 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-05-26 00:46:07 +0000
commit28cada041811fe49c8da1eb7ffdbc949719f9009 (patch)
tree8b90e7057ebc557a755e0ceb665e037c6fbb58a6 /sysdeps/pthread
parent02802fafcf6e11ea3f998f685035ffe568dfddeb (diff)
downloadglibc-28cada041811fe49c8da1eb7ffdbc949719f9009.tar.xz
glibc-28cada041811fe49c8da1eb7ffdbc949719f9009.zip
htl: Add clock variants
* htl/pt-join.c (__pthread_join): Move implementation to... (__pthread_join_common): ... new function. Add try, timed and clock support. (__pthread_join): Reimplement on top of __pthread_join_common. (__pthread_tryjoin_np, __pthread_timedjoin_np, __pthread_clockjoin_np): Implement on top of __pthread_join_common. (pthread_tryjoin_np, pthread_timedjoin_np, pthread_clockjoin_np): New aliases. * hurd/hurdlock.c (__lll_abstimed_wait, __lll_abstimed_xwait, __lll_abstimed_lock): Check for supported clock. * sysdeps/htl/pt-cond-timedwait.c (__pthread_cond_timedwait_internal): Add clockid parameter and support it. (__pthread_cond_timedwait): Pass -1 as clockid. (__pthread_cond_clockwait): New function. (pthread_cond_clockwait): New alias. * sysdeps/htl/pt-cond-wait.c (__pthread_cond_timedwait_internal): Update prototype. (__pthread_cond_wait): Pass -1 as clockid. * sysdeps/htl/pt-rwlock-timedrdlock.c (__pthread_rwlock_timedrdlock_internal): Add clockid parameter, and support id. (__pthread_rwlock_clockrdlock): New function. (pthread_rwlock_clockrdlock): New alias. * sysdeps/htl/pt-rwlock-rdlock.c (__pthread_rwlock_timedrdlock_internal): Update prototype. (__pthread_rwlock_rdlock): Pass -1 as clockid. * sysdeps/htl/pt-rwlock-timedwrlock.c (__pthread_rwlock_timedwrlock_internal): Add clockid parameter, and support id. (__pthread_rwlock_clockwrlock): New function. (pthread_rwlock_clockwrlock): New alias. * sysdeps/htl/pt-rwlock-wrlock.c (__pthread_rwlock_timedwrlock_internal): Update prototype. (__pthread_rwlock_wrlock): Pass -1 as clockid. * sysdeps/mach/hurd/htl/pt-mutex-timedlock.c (__pthread_mutex_timedlock): Move implementation to (__pthread_mutex_clocklock): New function with additional clockid parameter and support it. (pthread_mutex_clocklock): New alias. (__pthread_mutex_timedlock): Reimplement on top of __pthread_mutex_clocklock. * sysdeps/htl/pthread.h (pthread_tryjoin_np, pthread_timedjoin_np, pthread_clockjoin_np, pthread_mutex_clocklock, pthread_cond_clockwait, pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock): New prototypes. * sysdeps/htl/pthreadP.h (__pthread_cond_clockwait): New prototype. * htl/Versions (GLIBC_2.32): Add pthread_cond_clockwait, pthread_mutex_clocklock, pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock, pthread_tryjoin_np, pthread_timedjoin_np, pthread_clockjoin_np. * sysdeps/mach/hurd/i386/libpthread.abilist (pthread_clockjoin_np, pthread_cond_clockwait, pthread_mutex_clocklock, pthread_rwlock_clockrdlock, pthread_rwlock_clockwrlock, pthread_timedjoin_np, pthread_tryjoin_np): New functions. * nptl/tst-abstime.c, nptl/tst-join10.c, nptl/tst-join11.c, nptl/tst-join12.c, nptl/tst-join13.c, nptl/tst-join14.c, nptl/tst-join2.c, nptl/tst-join3.c, nptl/tst-join8.c, nptl/tst-join9.c, nptl/tst-mutex-errorcheck.c, nptl/tst-pthread-mutexattr.c, nptl/tst-mutex11.c, nptl/tst-mutex5.c, nptl/tst-mutex7.c, nptl/tst-mutex7robus.c, nptl/tst-mutex9.c, nptl/tst-rwlock12.c, nptl/tst-rwlock14.c: Move to sysdeps/pthread. * sysdeps/pthread/tst-mutex8.c: Move back to nptl. * nptl/Makefile (tests): Move tst-mutex5, tst-mutex7, tst-mutex7robust, tst-mutex9, tst-mutex11, tst-rwlock12, tst-rwlock14, tst-join2, tst-join3, tst-join8, tst-join9 tst-join10, tst-join11, tst-join12, tst-join13, tst-join14, tst-abstime, tst-mutex-errorcheck, tst-pthread-mutexattr to ... * sysdeps/pthread/Makefile (tests): ... here.
Diffstat (limited to 'sysdeps/pthread')
-rw-r--r--sysdeps/pthread/Makefile14
-rw-r--r--sysdeps/pthread/tst-abstime.c73
-rw-r--r--sysdeps/pthread/tst-join10.c20
-rw-r--r--sysdeps/pthread/tst-join11.c21
-rw-r--r--sysdeps/pthread/tst-join12.c20
-rw-r--r--sysdeps/pthread/tst-join13.c21
-rw-r--r--sysdeps/pthread/tst-join14.c74
-rw-r--r--sysdeps/pthread/tst-join2.c103
-rw-r--r--sysdeps/pthread/tst-join3.c99
-rw-r--r--sysdeps/pthread/tst-join8.c20
-rw-r--r--sysdeps/pthread/tst-join9.c21
-rw-r--r--sysdeps/pthread/tst-mutex-errorcheck.c52
-rw-r--r--sysdeps/pthread/tst-mutex11.c69
-rw-r--r--sysdeps/pthread/tst-mutex5.c119
-rw-r--r--sysdeps/pthread/tst-mutex7.c189
-rw-r--r--sysdeps/pthread/tst-mutex7robust.c7
-rw-r--r--sysdeps/pthread/tst-mutex8.c435
-rw-r--r--sysdeps/pthread/tst-mutex9.c140
-rw-r--r--sysdeps/pthread/tst-pthread-mutexattr.c60
-rw-r--r--sysdeps/pthread/tst-rwlock12.c207
-rw-r--r--sysdeps/pthread/tst-rwlock14.c96
21 files changed, 1421 insertions, 439 deletions
diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index 2f8aff35b2..b8dcadd2db 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -51,17 +51,23 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \
tst-cond23 tst-cond24 tst-cond25 \
tst-cond-except \
- tst-join1 tst-join4 tst-join5 tst-join6 tst-join7 \
+ tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 tst-join6 tst-join7 \
+ tst-join8 tst-join9 tst-join10 tst-join11 tst-join12 tst-join13 \
+ tst-join14 \
tst-key1 tst-key2 tst-key3 tst-key4 \
- tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 tst-mutex6 tst-mutex10 \
+ tst-mutex-errorcheck tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 \
+ tst-mutex5 tst-mutex6 tst-mutex7 tst-mutex7robust tst-mutex9 \
+ tst-mutex10 tst-mutex11 tst-pthread-mutexattr \
tst-once1 tst-once2 tst-once3 tst-once4 \
tst-robust1 tst-robust2 tst-robust3 tst-robust4 tst-robust5 \
tst-robust6 tst-robust7 tst-robust9 tst-robust10 \
- tst-rwlock1 tst-rwlock4 tst-rwlock5 tst-rwlock13 tst-rwlock16 \
+ tst-rwlock1 tst-rwlock4 tst-rwlock5 tst-rwlock12 \
+ tst-rwlock13 tst-rwlock14 tst-rwlock16 \
tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall \
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem6 tst-sem7 \
tst-sem8 tst-sem9 tst-sem10 tst-sem14 tst-sem15 tst-sem16 \
- tst-spin1 tst-spin2 tst-spin3 tst-spin4
+ tst-spin1 tst-spin2 tst-spin3 tst-spin4 \
+ tst-abstime
tests-internal += tst-robust8
diff --git a/sysdeps/pthread/tst-abstime.c b/sysdeps/pthread/tst-abstime.c
new file mode 100644
index 0000000000..90ed9194e3
--- /dev/null
+++ b/sysdeps/pthread/tst-abstime.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 2010-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Schwab <schwab@redhat.com>, 2010.
+
+ 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <support/check.h>
+#include <support/xthread.h>
+
+static pthread_cond_t c = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER;
+static pthread_rwlock_t rw1 = PTHREAD_RWLOCK_INITIALIZER;
+static pthread_rwlock_t rw2 = PTHREAD_RWLOCK_INITIALIZER;
+static sem_t sem;
+
+static void *
+th (void *arg)
+{
+ struct timespec t = { -2, 0 };
+
+ TEST_COMPARE (pthread_mutex_timedlock (&m1, &t), ETIMEDOUT);
+ TEST_COMPARE (pthread_mutex_clocklock (&m1, CLOCK_REALTIME, &t), ETIMEDOUT);
+ TEST_COMPARE (pthread_mutex_clocklock (&m1, CLOCK_MONOTONIC, &t), ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_timedrdlock (&rw1, &t), ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_timedwrlock (&rw2, &t), ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_clockrdlock (&rw1, CLOCK_REALTIME, &t),
+ ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_clockwrlock (&rw2, CLOCK_REALTIME, &t),
+ ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_clockrdlock (&rw1, CLOCK_MONOTONIC, &t),
+ ETIMEDOUT);
+ TEST_COMPARE (pthread_rwlock_clockwrlock (&rw2, CLOCK_MONOTONIC, &t),
+ ETIMEDOUT);
+ return NULL;
+}
+
+static int
+do_test (void)
+{
+ struct timespec t = { -2, 0 };
+
+ sem_init (&sem, 0, 0);
+ TEST_COMPARE (sem_timedwait (&sem, &t), -1);
+ TEST_COMPARE (errno, ETIMEDOUT);
+
+ xpthread_mutex_lock (&m1);
+ xpthread_rwlock_wrlock (&rw1);
+ xpthread_rwlock_rdlock (&rw2);
+ xpthread_mutex_lock (&m2);
+ pthread_t pth = xpthread_create (0, th, 0);
+ TEST_COMPARE (pthread_cond_timedwait (&c, &m2, &t), ETIMEDOUT);
+ xpthread_join (pth);
+ return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/pthread/tst-join10.c b/sysdeps/pthread/tst-join10.c
new file mode 100644
index 0000000000..6e94c00f75
--- /dev/null
+++ b/sysdeps/pthread/tst-join10.c
@@ -0,0 +1,20 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+ Copyright (C) 2019-2020 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/>. */
+
+#define USE_PTHREAD_CLOCKJOIN_NP_REALTIME 1
+#include <sysdeps/pthread/tst-join5.c>
diff --git a/sysdeps/pthread/tst-join11.c b/sysdeps/pthread/tst-join11.c
new file mode 100644
index 0000000000..ed8312bc6b
--- /dev/null
+++ b/sysdeps/pthread/tst-join11.c
@@ -0,0 +1,21 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+ Copyright (C) 2019-2020 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/>. */
+
+#define USE_PTHREAD_CLOCKJOIN_NP_REALTIME 1
+#define WAIT_IN_CHILD 1
+#include <sysdeps/pthread/tst-join5.c>
diff --git a/sysdeps/pthread/tst-join12.c b/sysdeps/pthread/tst-join12.c
new file mode 100644
index 0000000000..57d713c82d
--- /dev/null
+++ b/sysdeps/pthread/tst-join12.c
@@ -0,0 +1,20 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+ Copyright (C) 2019-2020 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/>. */
+
+#define USE_PTHREAD_CLOCKJOIN_NP_MONOTONIC 1
+#include <sysdeps/pthread/tst-join5.c>
diff --git a/sysdeps/pthread/tst-join13.c b/sysdeps/pthread/tst-join13.c
new file mode 100644
index 0000000000..61a9106ebf
--- /dev/null
+++ b/sysdeps/pthread/tst-join13.c
@@ -0,0 +1,21 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+ Copyright (C) 2019-2020 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/>. */
+
+#define USE_PTHREAD_CLOCKJOIN_NP_MONOTONIC 1
+#define WAIT_IN_CHILD 1
+#include <sysdeps/pthread/tst-join5.c>
diff --git a/sysdeps/pthread/tst-join14.c b/sysdeps/pthread/tst-join14.c
new file mode 100644
index 0000000000..0109324453
--- /dev/null
+++ b/sysdeps/pthread/tst-join14.c
@@ -0,0 +1,74 @@
+/* pthread_timedjoin_np, pthread_clockjoin_np NULL timeout test.
+ Copyright (C) 2019-2020 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <support/check.h>
+#include <support/timespec.h>
+#include <support/xthread.h>
+#include <support/xtime.h>
+
+
+#define CLOCK_USE_TIMEDJOIN (-1)
+
+
+static void *
+tf (void *arg)
+{
+ struct timespec ts = make_timespec(0, 100000);
+ nanosleep(&ts, NULL);
+
+ return (void *) 42l;
+}
+
+
+/* Check that pthread_timedjoin_np and pthread_clockjoin_np wait "forever" if
+ * passed a timeout parameter of NULL. We can't actually wait forever, but we
+ * can be sure that we did at least wait for some time by checking the exit
+ * status of the thread. */
+static int
+do_test_clock (clockid_t clockid)
+{
+ pthread_t th = xpthread_create (NULL, tf, NULL);
+
+ void *status;
+ int val = (clockid == CLOCK_USE_TIMEDJOIN)
+ ? pthread_timedjoin_np (th, &status, NULL)
+ : pthread_clockjoin_np (th, &status, clockid, NULL);
+ TEST_COMPARE (val, 0);
+
+ if (status != (void *) 42l)
+ FAIL_EXIT1 ("return value %p, expected %p\n", status, (void *) 42l);
+
+ return 0;
+}
+
+static int
+do_test (void)
+{
+ do_test_clock (CLOCK_USE_TIMEDJOIN);
+ do_test_clock (CLOCK_REALTIME);
+ do_test_clock (CLOCK_MONOTONIC);
+ return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/pthread/tst-join2.c b/sysdeps/pthread/tst-join2.c
new file mode 100644
index 0000000000..22dfd11b82
--- /dev/null
+++ b/sysdeps/pthread/tst-join2.c
@@ -0,0 +1,103 @@
+/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+
+
+static void *
+tf (void *arg)
+{
+ if (pthread_mutex_lock (&lock) != 0)
+ {
+ puts ("child: mutex_lock failed");
+ return NULL;
+ }
+
+ return (void *) 42l;
+}
+
+
+static int
+do_test (void)
+{
+ pthread_t th;
+
+ if (pthread_mutex_lock (&lock) != 0)
+ {
+ puts ("mutex_lock failed");
+ exit (1);
+ }
+
+ if (pthread_create (&th, NULL, tf, NULL) != 0)
+ {
+ puts ("mutex_create failed");
+ exit (1);
+ }
+
+ void *status;
+ int val = pthread_tryjoin_np (th, &status);
+ if (val == 0)
+ {
+ puts ("1st tryjoin succeeded");
+ exit (1);
+ }
+ else if (val != EBUSY)
+ {
+ puts ("1st tryjoin didn't return EBUSY");
+ exit (1);
+ }
+
+ if (pthread_mutex_unlock (&lock) != 0)
+ {
+ puts ("mutex_unlock failed");
+ exit (1);
+ }
+
+ while ((val = pthread_tryjoin_np (th, &status)) != 0)
+ {
+ if (val != EBUSY)
+ {
+ printf ("tryjoin returned %s (%d), expected only 0 or EBUSY\n",
+ strerror (val), val);
+ exit (1);
+ }
+
+ /* Delay minimally. */
+ struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 };
+ nanosleep (&ts, NULL);
+ }
+
+ if (status != (void *) 42l)
+ {
+ printf ("return value %p, expected %p\n", status, (void *) 42l);
+ exit (1);
+ }
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/pthread/tst-join3.c b/sysdeps/pthread/tst-join3.c
new file mode 100644
index 0000000000..ffebcf586f
--- /dev/null
+++ b/sysdeps/pthread/tst-join3.c
@@ -0,0 +1,99 @@
+/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
+
+ 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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <support/check.h>
+#include <support/timespec.h>
+#include <support/xthread.h>
+#include <support/xtime.h>
+
+
+#define CLOCK_USE_TIMEDJOIN (-1)
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+
+
+static void *
+tf (void *arg)
+{
+ xpthread_mutex_lock (&lock);
+ xpthread_mutex_unlock (&lock);
+
+ return (void *) 42l;
+}
+
+
+static int
+do_test_clock (clockid_t clockid)
+{
+ const clockid_t clockid_for_get =
+ (clockid == CLOCK_USE_TIMEDJOIN) ? CLOCK_REALTIME : clockid;
+
+ xpthread_mutex_lock (&lock);
+ pthread_t th = xpthread_create (NULL, tf, NULL);
+
+ void *status;
+ struct timespec timeout = timespec_add (xclock_now (clockid_for_get),
+ make_times