]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Add pthread_clockjoin_np
authorMike Crowe <mac@mcrowe.com>
Thu, 31 Oct 2019 13:03:21 +0000 (10:03 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 1 Nov 2019 14:23:43 +0000 (11:23 -0300)
Introduce pthread_clockjoin_np as a version of pthread_timedjoin_np that
accepts a clockid_t parameter to indicate which clock the timeout should be
measured against. This mirrors the recently-added POSIX-proposed "clock"
wait functions.

Checked on x86_64-linux-gnu.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
45 files changed:
NEWS
manual/threads.texi
nptl/Makefile
nptl/Versions
nptl/pthreadP.h
nptl/pthread_clockjoin.c [new file with mode: 0644]
nptl/pthread_join.c
nptl/pthread_join_common.c
nptl/pthread_timedjoin.c
nptl/pthread_tryjoin.c
nptl/thrd_join.c
nptl/tst-join10.c [new file with mode: 0644]
nptl/tst-join11.c [new file with mode: 0644]
nptl/tst-join12.c [new file with mode: 0644]
nptl/tst-join13.c [new file with mode: 0644]
nptl/tst-join3.c
nptl/tst-join5.c
sysdeps/nptl/pthread.h
sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
sysdeps/unix/sysv/linux/alpha/libpthread.abilist
sysdeps/unix/sysv/linux/arm/be/libpthread.abilist
sysdeps/unix/sysv/linux/arm/le/libpthread.abilist
sysdeps/unix/sysv/linux/csky/libpthread.abilist
sysdeps/unix/sysv/linux/hppa/libpthread.abilist
sysdeps/unix/sysv/linux/i386/libpthread.abilist
sysdeps/unix/sysv/linux/ia64/libpthread.abilist
sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
sysdeps/unix/sysv/linux/microblaze/be/libpthread.abilist
sysdeps/unix/sysv/linux/microblaze/le/libpthread.abilist
sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
sysdeps/unix/sysv/linux/nios2/libpthread.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
sysdeps/unix/sysv/linux/sh/be/libpthread.abilist
sysdeps/unix/sysv/linux/sh/le/libpthread.abilist
sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist

diff --git a/NEWS b/NEWS
index 75b380c0f8da6e3f9754feeca48dd9afaeae8f1a..3006b1a8e471bfbe90118dc763f5f0b7d60a7ee7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -34,6 +34,10 @@ Major new features:
   will always receive a 'struct timezone' whose tz_minuteswest and
   tz_dsttime fields are zero.
 
+* The function pthread_clockjoin_np has been added, enabling join with a
+  terminated thread with an specific clock.  It allows waiting against
+  CLOCK_MONOTONIC and CLOCK_REALTIME.  This function is a GNU extension.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * The totalorder and totalordermag functions, and the corresponding
index c0b504dc1fffda737a82ff64273ed1aa95f158fb..e40b55c090dcd7ecab55a21087a0a451f1f297a3 100644 (file)
@@ -751,6 +751,18 @@ reached if the thread has not terminated by that time and return
 will wait forever in the same way as @code{pthread_join}.
 @end deftypefun
 
+@comment pthread.h
+@comment GNU extension
+@deftypefun int pthread_clockjoin_np (pthread_t *@var{thread},
+                                     void **@var{thread_return},
+                                      clockid_t @var{clockid},
+                                     const struct timespec *@var{abstime})
+@standards{GNU, pthread.h}
+@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
+Behaves like @code{pthread_timedjoin_np} except that time absolute time in
+@var{abstime} is measured against the clock specified by @var{clockid}.
+@end deftypefun
+
 @c FIXME these are undocumented:
 @c pthread_atfork
 @c pthread_attr_destroy
index 41f8f5e8d232cf31138a3d83f27e05a24e9dbf62..bbb281e733c7ad6c1f4052a079c10b2c74429557 100644 (file)
@@ -53,7 +53,7 @@ pthread-compat-wrappers = \
 libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
                      pthread_create pthread_exit pthread_detach \
                      pthread_join pthread_tryjoin pthread_timedjoin \
-                     pthread_join_common pthread_yield \
+                     pthread_clockjoin pthread_join_common pthread_yield \
                      pthread_getconcurrency pthread_setconcurrency \
                      pthread_getschedparam pthread_setschedparam \
                      pthread_setschedprio \
@@ -189,6 +189,7 @@ CFLAGS-forward.c += -fexceptions
 CFLAGS-pthread_testcancel.c += -fexceptions
 CFLAGS-pthread_join.c += -fexceptions -fasynchronous-unwind-tables
 CFLAGS-pthread_timedjoin.c += -fexceptions -fasynchronous-unwind-tables
+CFLAGS-pthread_clockjoin.c += -fexceptions -fasynchronous-unwind-tables
 CFLAGS-pthread_once.c += $(uses-callbacks) -fexceptions \
                        -fasynchronous-unwind-tables
 CFLAGS-pthread_cond_wait.c += -fexceptions -fasynchronous-unwind-tables
@@ -273,7 +274,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
        tst-kill1 tst-kill2 tst-kill3 tst-kill4 tst-kill5 tst-kill6 \
        tst-raise1 \
        tst-join1 tst-join2 tst-join3 tst-join4 tst-join5 tst-join6 tst-join7 \
-       tst-join8 tst-join9 \
+       tst-join8 tst-join9 tst-join10 tst-join11 tst-join12 tst-join13 \
        tst-detach1 \
        tst-eintr2 tst-eintr3 tst-eintr4 tst-eintr5 \
        tst-tsd1 tst-tsd2 tst-tsd3 tst-tsd4 tst-tsd5 tst-tsd6 \
index be7e810875774954123ec15bcd5923d530902805..adbd4fa589fe829053479ae2522280cad28f5e48 100644 (file)
@@ -277,6 +277,10 @@ libpthread {
     pthread_mutex_clocklock;
   }
 
+  GLIBC_2.31 {
+    pthread_clockjoin_np;
+  }
+
   GLIBC_PRIVATE {
     __pthread_initialize_minimal;
     __pthread_clock_gettime; __pthread_clock_settime;
index 070b3afa8d84de110f5e6f6658f6e7a11e7b7584..bbb2bf0222dd741a86de96fc01277c06c0928510 100644 (file)
@@ -475,8 +475,10 @@ extern int __pthread_setcanceltype (int type, int *oldtype);
 extern int __pthread_enable_asynccancel (void) attribute_hidden;
 extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden;
 extern void __pthread_testcancel (void);
-extern int __pthread_timedjoin_ex (pthread_t, void **, const struct timespec *,
-                                  bool);
+extern int __pthread_clockjoin_ex (pthread_t, void **, clockid_t,
+                                  const struct timespec *, bool)
+  attribute_hidden;
+
 
 #if IS_IN (libpthread)
 hidden_proto (__pthread_mutex_init)
@@ -495,7 +497,6 @@ hidden_proto (__pthread_setcancelstate)
 hidden_proto (__pthread_testcancel)
 hidden_proto (__pthread_mutexattr_init)
 hidden_proto (__pthread_mutexattr_settype)
-hidden_proto (__pthread_timedjoin_ex)
 #endif
 
 extern int __pthread_cond_broadcast_2_0 (pthread_cond_2_0_t *cond);
diff --git a/nptl/pthread_clockjoin.c b/nptl/pthread_clockjoin.c
new file mode 100644 (file)
index 0000000..7c8c3ac
--- /dev/null
@@ -0,0 +1,29 @@
+/* Join with a terminated thread using an specific clock.
+   Copyright (C) 2019 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 "pthreadP.h"
+
+int
+__pthread_clockjoin_np (pthread_t threadid, void **thread_return,
+                       clockid_t clockid,
+                       const struct timespec *abstime)
+{
+  return __pthread_clockjoin_ex (threadid, thread_return,
+                                 clockid, abstime, true);
+}
+weak_alias (__pthread_clockjoin_np, pthread_clockjoin_np)
index 3523b20fe5981d801498a50c5c63b88270ceabfc..c7ff5a393b716ef22eaf1e8c37ec99471c3ab900 100644 (file)
@@ -21,6 +21,7 @@
 int
 __pthread_join (pthread_t threadid, void **thread_return)
 {
-  return __pthread_timedjoin_ex (threadid, thread_return, NULL, true);
+  return __pthread_clockjoin_ex (threadid, thread_return, 0 /* Ignored */,
+                                NULL, true);
 }
 weak_alias (__pthread_join, pthread_join)
index 4d91c6fbf288bb8145895d32337313becf13b43b..998d227e2ce66b4fd90ad60359f70e518b3f8f19 100644 (file)
@@ -37,7 +37,7 @@ cleanup (void *arg)
    afterwards.  The kernel up to version 3.16.3 does not use the private futex
    operations for futex wake-up when the clone terminates.  */
 static int
-timedwait_tid (pid_t *tidp, const struct timespec *abstime)
+clockwait_tid (pid_t *tidp, clockid_t clockid, const struct timespec *abstime)
 {
   pid_t tid;
 
@@ -49,8 +49,10 @@ timedwait_tid (pid_t *tidp, const struct timespec *abstime)
     {
       struct timespec rt;
 
-      /* Get the current time.  */
-      __clock_gettime (CLOCK_REALTIME, &rt);
+      /* Get the current time. This can only fail if clockid is
+         invalid. */
+      if (__glibc_unlikely (__clock_gettime (clockid, &rt)))
+        return EINVAL;
 
       /* Compute relative timeout.  */
       rt.tv_sec = abstime->tv_sec - rt.tv_sec;
@@ -77,7 +79,8 @@ timedwait_tid (pid_t *tidp, const struct timespec *abstime)
 }
 
 int
-__pthread_timedjoin_ex (pthread_t threadid, void **thread_return,
+__pthread_clockjoin_ex (pthread_t threadid, void **thread_return,
+                       clockid_t clockid,
                        const struct timespec *abstime, bool block)
 {
   struct pthread *pd = (struct pthread *) threadid;
@@ -122,7 +125,7 @@ __pthread_timedjoin_ex (pthread_t threadid, void **thread_return,
 
   /* BLOCK waits either indefinitely or based on an absolute time.  POSIX also
      states a cancellation point shall occur for pthread_join, and we use the
-     same rationale for posix_timedjoin_np.  Both timedwait_tid and the futex
+     same rationale for posix_timedjoin_np.  Both clockwait_tid and the futex
      call use the cancellable variant.  */
   if (block)
     {
@@ -132,7 +135,7 @@ __pthread_timedjoin_ex (pthread_t threadid, void **thread_return,
       pthread_cleanup_push (cleanup, &pd->joinid);
 
       if (abstime != NULL)
-       result = timedwait_tid (&pd->tid, abstime);
+       result = clockwait_tid (&pd->tid, clockid, abstime);
       else
        {
          pid_t tid;
@@ -165,4 +168,3 @@ __pthread_timedjoin_ex (pthread_t threadid, void **thread_return,
 
   return result;
 }
-hidden_def (__pthread_timedjoin_ex)
index bb48a1e3cf29f874fd22f162c0b8623c037b96d8..1890d1aec6c6035835bc0efa7efe19490eb26936 100644 (file)
@@ -22,6 +22,7 @@ int
 __pthread_timedjoin_np (pthread_t threadid, void **thread_return,
                        const struct timespec *abstime)
 {
-  return __pthread_timedjoin_ex (threadid, thread_return, abstime, true);
+  return __pthread_clockjoin_ex (threadid, thread_return,
+                                 CLOCK_REALTIME, abstime, true);
 }
 weak_alias (__pthread_timedjoin_np, pthread_timedjoin_np)
index 28e765ba60090dbed874226e86798eb35ddc1a1e..a15fd5fab0bdcccee19eb39242444b4eab6fa771 100644 (file)
@@ -28,5 +28,6 @@ pthread_tryjoin_np (pthread_t threadid, void **thread_return)
 
   /* If pd->tid == 0 then lll_wait_tid will not block on futex
      operation.  */
-  return __pthread_timedjoin_ex (threadid, thread_return, NULL, false);
+  return __pthread_clockjoin_ex (threadid, thread_return, 0 /* Ignored */,
+                                NULL, false);
 }
index 497d0d2173881e6affcb4519498d562aea4f694d..10d9a72cc81d8798003816037b233ac609a6a9c0 100644 (file)
@@ -22,7 +22,7 @@ int
 thrd_join (thrd_t thr, int *res)
 {
   void *pthread_res;
-  int err_code = __pthread_timedjoin_ex (thr, &pthread_res, NULL, true);
+  int err_code = __pthread_clockjoin_ex (thr, &pthread_res, 0, NULL, true);
   if (res)
    *res = (int) (uintptr_t) pthread_res;
 
diff --git a/nptl/tst-join10.c b/nptl/tst-join10.c
new file mode 100644 (file)
index 0000000..a222dd1
--- /dev/null
@@ -0,0 +1,20 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+   Copyright (C) 2019 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 <nptl/tst-join5.c>
diff --git a/nptl/tst-join11.c b/nptl/tst-join11.c
new file mode 100644 (file)
index 0000000..341588a
--- /dev/null
@@ -0,0 +1,21 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+   Copyright (C) 2019 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 <nptl/tst-join5.c>
diff --git a/nptl/tst-join12.c b/nptl/tst-join12.c
new file mode 100644 (file)
index 0000000..44592dc
--- /dev/null
@@ -0,0 +1,20 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+   Copyright (C) 2019 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 <nptl/tst-join5.c>
diff --git a/nptl/tst-join13.c b/nptl/tst-join13.c
new file mode 100644 (file)
index 0000000..d4e49d5
--- /dev/null
@@ -0,0 +1,21 @@
+/* Check if pthread_clockjoin_np is a cancellation entrypoint.
+   Copyright (C) 2019 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 <nptl/tst-join5.c>
index a4ae45954320703ca30455632d697fec62fac422..faf7683eaa11fbd42fe97f0b5bd2a9875039abb7 100644 (file)
@@ -28,6 +28,8 @@
 #include <support/xtime.h>
 
 
+#define CLOCK_USE_TIMEDJOIN (-1)
+
 static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
 
@@ -35,32 +37,44 @@ static void *
 tf (void *arg)
 {
   xpthread_mutex_lock (&lock);
+  xpthread_mutex_unlock (&lock);
 
   return (void *) 42l;
 }
 
 
 static int
-do_test (void)
+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 (CLOCK_REALTIME),
+  struct timespec timeout = timespec_add (xclock_now (clockid_for_get),
                                           make_timespec (0, 200000000));
 
-  int val = pthread_timedjoin_np (th, &status, &timeout);
+  int val;
+  if (clockid == CLOCK_USE_TIMEDJOIN)
+    val = pthread_timedjoin_np (th, &status, &timeout);
+  else
+    val = pthread_clockjoin_np (th, &status, clockid, &timeout);
+
   TEST_COMPARE (val, ETIMEDOUT);
 
   xpthread_mutex_unlock (&lock);
 
   while (1)
     {
-      timeout = timespec_add (xclock_now (CLOCK_REALTIME),
+      timeout = timespec_add (xclock_now (clockid_for_get),
                               make_timespec (0, 200000000));
 
-      val = pthread_timedjoin_np (th, &status, &timeout);
+      if (clockid == CLOCK_USE_TIMEDJOIN)
+        val = pthread_timedjoin_np (th, &status, &timeout);
+      else
+        val = pthread_clockjoin_np (th, &status, clockid, &timeout);
       if (val == 0)
        break;
 
@@ -73,4 +87,13 @@ do_test (void)
   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>
index 41cacf1251a384a98b55347a80f899a5796b0f28..2fa178cc905ea72ccd7ed97bf327b48bd4080a98 100644 (file)
@@ -24,7 +24,9 @@
 #include <unistd.h>
 
 #include <support/check.h>
+#include <support/timespec.h>
 #include <support/xthread.h>
+#include <support/xtime.h>
 
 static void
 wait_code (void)
@@ -42,14 +44,20 @@ static pthread_barrier_t b;
 static int
 thread_join (pthread_t thread, void **retval)
 {
-#ifdef USE_PTHREAD_TIMEDJOIN_NP
-  struct timespec tv;
-  TEST_COMPARE (clock_gettime (CLOCK_REALTIME, &tv), 0);
-  /* Arbitrary large timeout to make it act as pthread_join.  */
-  tv.tv_sec += 1000;
-  return pthread_timedjoin_np ((pthread_t) thread, retval, &tv);
+#if defined USE_PTHREAD_TIMEDJOIN_NP
+  const struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME),
+                                           make_timespec (1000, 0));
+  return pthread_timedjoin_np (thread, retval, &ts);
+#elif defined USE_PTHREAD_CLOCKJOIN_NP_REALTIME
+  const struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME),
+                                           make_timespec (1000, 0));
+  return pthread_clockjoin_np (thread, retval, CLOCK_REALTIME, &ts);
+#elif defined USE_PTHREAD_CLOCKJOIN_NP_MONOTONIC
+  const struct timespec ts = timespec_add (xclock_now (CLOCK_MONOTONIC),
+                                           make_timespec (1000, 0));
+  return pthread_clockjoin_np (thread, retval, CLOCK_MONOTONIC, &ts);
 #else
-  return pthread_join ((pthread_t) thread, retval);
+  return pthread_join (thread, retval);
 #endif
 }
 
index 467b446aca5a2acf6d4ae6dc1d75dc69edb71bef..d2fe6b7479263cf40033ff0a2f758ceac5a18ad4 100644 (file)
@@ -263,6 +263,17 @@ extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) __THROW;
    __THROW.  */
 extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return,
                                 const struct timespec *__abstime);
+
+/* Make calling thread wait for termination of the thread TH, but only
+   until TIMEOUT measured against the clock specified by CLOCKID.  The
+   exit status of the thread is stored in *THREAD_RETURN, if
+   THREAD_RETURN is not NULL.
+
+   This function is a cancellation point and therefore not marked with
+   __THROW.  */
+extern int pthread_clockjoin_np (pthread_t __th, void **__thread_return,
+                                 clockid_t clockid,
+                                const struct timespec *__abstime);
 #endif
 
 /* Indicate that the thread TH is never to be joined with PTHREAD_JOIN.
index cf5df610a1197af99bbc85959d08c913d4180ece..e6e6489b02f38e5cf5f24cc47dfb8d30e39f3c35 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index f9d5e4a3c18554e4fb18ef46e158c1e296c76f42..89e129aa1efb87ad5df6161fad009dc7d0468e5d 100644 (file)
@@ -248,6 +248,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index e1641998046c8526ecc056c2bcc2d9073bb980ac..1961bd0da061e9b890431ec7174a01bed1cdf09e 100644 (file)
@@ -32,6 +32,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 _IO_flockfile F
 GLIBC_2.4 _IO_ftrylockfile F
 GLIBC_2.4 _IO_funlockfile F
index e1641998046c8526ecc056c2bcc2d9073bb980ac..1961bd0da061e9b890431ec7174a01bed1cdf09e 100644 (file)
@@ -32,6 +32,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 _IO_flockfile F
 GLIBC_2.4 _IO_ftrylockfile F
 GLIBC_2.4 _IO_funlockfile F
index 07a4af88336c1b51e95e4d1348c06df619bc6a7b..259f6a8ff37644626a1114db16e5c3f3157d09f7 100644 (file)
@@ -229,3 +229,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index b82e3d69e0b068752bb4dd43dc9aa923fee2ff4e..c03a4a67319b6c714faed9a5db2251c39b46fce0 100644 (file)
@@ -238,6 +238,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 0684d80ce337dc3bf6aea512a089fcf2b761c347..831cdecca4107686fdbecbbb29925217ed7b2255 100644 (file)
@@ -246,6 +246,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 0b35e50202a601f95cc3a0ac5204b1d1d7fecc36..7609d56186b870d766b4ff09735aa50cda28a943 100644 (file)
@@ -240,6 +240,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index e1641998046c8526ecc056c2bcc2d9073bb980ac..1961bd0da061e9b890431ec7174a01bed1cdf09e 100644 (file)
@@ -32,6 +32,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 _IO_flockfile F
 GLIBC_2.4 _IO_ftrylockfile F
 GLIBC_2.4 _IO_funlockfile F
index 0684d80ce337dc3bf6aea512a089fcf2b761c347..831cdecca4107686fdbecbbb29925217ed7b2255 100644 (file)
@@ -246,6 +246,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 57bd0a433c88f618088a3f272bef727f28fe4d39..269cd0994f73f2dea7670ad97a47dd7d204dd52e 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index 57bd0a433c88f618088a3f272bef727f28fe4d39..269cd0994f73f2dea7670ad97a47dd7d204dd52e 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index 67292c8e0b5a7077bd4b4f455965d1e35484eb05..d3288b4ab3f05349ffd9a86ca895f6027d3d391c 100644 (file)
@@ -247,6 +247,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 67292c8e0b5a7077bd4b4f455965d1e35484eb05..d3288b4ab3f05349ffd9a86ca895f6027d3d391c 100644 (file)
@@ -247,6 +247,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 3d47f9d21dd995c151ac0b6100ca3ef24376f1f6..961cd4a60cdef5e1066faebc77b8609d48ce8652 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index 322f6da2023658c76380bd7b48163f1eeaa05dbf..66845c2e1ea066e20bbc42934e0b8fbd11303a84 100644 (file)
@@ -248,6 +248,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 62ce0edb0cb403745c018a637de2d17e662faf3e..143ed2dc7b69c78c9c0a8a0d785a8729c256faef 100644 (file)
@@ -239,6 +239,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index cf5df610a1197af99bbc85959d08c913d4180ece..e6e6489b02f38e5cf5f24cc47dfb8d30e39f3c35 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index b4d4528fc7b102d0c49d37723aa1914f497e3649..b52721ca6f07d61525e96d5901c69c6e2fe6cb08 100644 (file)
@@ -231,3 +231,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
index c8f0cda05c93a1fa6b85e43fdf3bd70c55226a4f..caf7f79355ff10713e7f3756d1c446f25b528e54 100644 (file)
@@ -248,6 +248,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 9887db4c70ba084155c7dbe43f065ddadb24e4a8..9e12e9b3a9b878f6a357832df7f6d58a4c7cf4ea 100644 (file)
@@ -240,6 +240,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index b82e3d69e0b068752bb4dd43dc9aa923fee2ff4e..c03a4a67319b6c714faed9a5db2251c39b46fce0 100644 (file)
@@ -238,6 +238,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index b82e3d69e0b068752bb4dd43dc9aa923fee2ff4e..c03a4a67319b6c714faed9a5db2251c39b46fce0 100644 (file)
@@ -238,6 +238,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index f9d5e4a3c18554e4fb18ef46e158c1e296c76f42..89e129aa1efb87ad5df6161fad009dc7d0468e5d 100644 (file)
@@ -248,6 +248,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 0b35e50202a601f95cc3a0ac5204b1d1d7fecc36..7609d56186b870d766b4ff09735aa50cda28a943 100644 (file)
@@ -240,6 +240,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index c3444b77a9c604d7841e17ba7155c8c560038d72..39f807bb5fef456095c581d61345affc07505e64 100644 (file)
@@ -238,6 +238,7 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F
 GLIBC_2.4 pthread_mutex_consistent_np F
 GLIBC_2.4 pthread_mutex_getprioceiling F
 GLIBC_2.4 pthread_mutex_setprioceiling F
index 4ede0036a52fa617348fc2b56e302f9fd0026f51..21191a7aa0a999e8de8a40319ba6b5be85bfc764 100644 (file)
@@ -236,3 +236,4 @@ GLIBC_2.30 pthread_mutex_clocklock F
 GLIBC_2.30 pthread_rwlock_clockrdlock F
 GLIBC_2.30 pthread_rwlock_clockwrlock F
 GLIBC_2.30 sem_clockwait F
+GLIBC_2.31 pthread_clockjoin_np F