This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v3 2/6] nptl: Add POSIX-proposed sem_clockwait
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Wed, 5 Jun 2019 18:07:18 -0300
- Subject: Re: [PATCH v3 2/6] nptl: Add POSIX-proposed sem_clockwait
- References: <cover.206947992e95511c1c56165c9aa98ae1a2296b75.1558987219.git-series.mac@mcrowe.com> <260b12640f1fa9ef3ce8f60830237d8885e3dc10.1558987219.git-series.mac@mcrowe.com>
On 27/05/2019 17:03, Mike Crowe wrote:
> Add:
>
> int sem_clockwait (sem_t *sem, clockid_t clock, const struct timespec *abstime)
>
> which behaves just like sem_timedwait, but measures abstime against the
> specified clock. Currently supports CLOCK_REALTIME and CLOCK_MONOTONIC and
> sets errno == EINVAL if any other clock is specified.
For non-POSIX definition we will need to first export it as a GNU extension
with a possible non-reserved name and later, when it is included on the
standard, to add an alias to the expected name.
The usual naming scheme is to append the _np suffix (non-portable) on
implementation, similar to recent posix_spawn file action extensions.
In this case it would be sem_clockwait_np.
>
> * nptl/sem_waitcommon.c (do_futex_wait, __new_sem_wait_slow): Add clockid
> parameters to indicate the clock which abstime should be measured
> against.
>
> * nptl/sem_timedwait.c (sem_timedwait), nptl/sem_wait.c (__new_sem_wait):
> Pass CLOCK_REALTIME as clockid to __new_sem_wait_slow.
>
> * nptl/sem_clockwait.c: New file to implement sem_clockwait based on
> sem_timedwait.c.
>
> * nptl/Makefile: Add sem_clockwait.c source file. Add CFLAGS for
> sem_clockwait.c to match those used for sem_timedwait.c.
>
> * sysdeps/pthread/semaphore.h: Add sem_clockwait.
>
> * nptl/Versions (GLIBC_2.30): Likewise.
>
> * sysdeps/unix/sysv/linux/aarch64/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/alpha/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/arm/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/csky/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/hppa/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/i386/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/ia64/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/microblaze/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/nios2/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/sh/libpthread.abilist (GLIBC_2.30): Likewise.
> * sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist (GLIBC_2.30):
> Likewise.
> * sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist (GLIBC_2.30):
> Likewise.
>
> * nptl/tst-sem17.c: Add new test for passing invalid clock to
> sem_clockwait.
>
> * nptl/tst-sem13.c, nptl/tst-sem5.c: Modify existing sem_timedwait tests to
> also test sem_clockwait.
>
> * manual/threads.texi: Document sem_clockwait.
> ---
> ChangeLog | 71 +++++++-
> manual/threads.texi | 10 +-
> nptl/Makefile | 5 +-
> nptl/Versions | 4 +-
> nptl/sem_clockwait.c | 45 ++++-
> nptl/sem_timedwait.c | 3 +-
> nptl/sem_wait.c | 3 +-
> nptl/sem_waitcommon.c | 15 +-
> nptl/tst-sem13.c | 39 +++-
> nptl/tst-sem17.c | 76 +++++++-
> nptl/tst-sem5.c | 23 +-
> sysdeps/pthread/semaphore.h | 7 +-
> sysdeps/unix/sysv/linux/aarch64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/alpha/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/arm/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/csky/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/hppa/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/i386/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/ia64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/microblaze/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/nios2/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/sh/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist | 1 +-
> sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist | 1 +-
> 36 files changed, 305 insertions(+), 20 deletions(-)
> create mode 100644 nptl/sem_clockwait.c
> create mode 100644 nptl/tst-sem17.c
>
> diff --git a/ChangeLog b/ChangeLog
> index ff85b12..814e331 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,76 @@
> 2019-05-27 Mike Crowe <mac@mcrowe.com>
>
> + nptl: Add POSIX-proposed sem_clockwait which behaves just like
> + sem_timedwait, but measures abstime against the specified clock.
> +
> + * nptl/sem_waitcommon.c (do_futex_wait, __new_sem_wait_slow): Add
> + clockid parameters to indicate the clock which abstime should be
> + measured against.
> +
> + * nptl/sem_timedwait.c (sem_timedwait), nptl/sem_wait.c
> + (__new_sem_wait): Pass CLOCK_REALTIME as clockid to
> + __new_sem_wait_slow.
> +
> + * nptl/sem_clockwait.c: New file to implement sem_clockwait based
> + on sem_timedwait.c.
> +
> + * nptl/Makefile: Add sem_clockwait.c source file. Add CFLAGS for
> + sem_clockwait.c to match those used for sem_timedwait.c.
> +
> + * sysdeps/pthread/semaphore.h: Add sem_clockwait.
> +
> + * nptl/Versions (GLIBC_2.30): Likewise.
> +
> + * sysdeps/unix/sysv/linux/aarch64/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/alpha/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/arm/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/csky/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/hppa/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/i386/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/ia64/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/nios2/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/sh/libpthread.abilist (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> + * sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> + (GLIBC_2.30): Likewise.
> +
> + * nptl/tst-sem17.c: Add new test for passing invalid clock to
> + sem_clockwait.
> +
> + * nptl/tst-sem13.c, nptl/tst-sem5.c: Modify existing sem_timedwait
> + tests to also test sem_clockwait.
> +
> + * manual/threads.texi: Document sem_clockwait.
> +
> +2019-05-27 Mike Crowe <mac@mcrowe.com>
> +
> nptl: Add clockid parameter to futex timed wait calls
>
> * sysdeps/nptl/lowlevellock-futex.h,
> diff --git a/manual/threads.texi b/manual/threads.texi
> index 87fda7d..674267c 100644
> --- a/manual/threads.texi
> +++ b/manual/threads.texi
> @@ -669,6 +669,16 @@ The system does not have sufficient memory.
> @end table
> @end deftypefun
>
> +@comment semaphore.h
> +@comment POSIX-proposed
> +@deftypefun int sem_clockwait (sem_t *@var{sem}, clockid_t @var{clockid},
> + const struct timespec *@var{abstime})
> +Behaves like @code{sem_timedwait} except the time @var{abstime} is measured
> +against the clock specified by @var{clockid} rather than
> +@code{CLOCK_REALTIME}. Currently, @var{clockid} must be either
> +@code{CLOCK_MONOTONIC} or @code{CLOCK_REALTIME}.
> +@end deftypefun
> +
> @c FIXME these are undocumented:
> @c pthread_atfork
> @c pthread_attr_destroy
Ok.
> diff --git a/nptl/Makefile b/nptl/Makefile
> index de312b3..43a99dc 100644
> --- a/nptl/Makefile
> +++ b/nptl/Makefile
> @@ -113,7 +113,7 @@ libpthread-routines = nptl-init nptlfreeres vars events version pt-interp \
> sem_init sem_destroy \
> sem_open sem_close sem_unlink \
> sem_getvalue \
> - sem_wait sem_timedwait sem_post \
> + sem_wait sem_timedwait sem_clockwait sem_post \
> cleanup cleanup_defer cleanup_compat \
> cleanup_defer_compat unwind \
> pt-longjmp pt-cleanup\
> @@ -193,6 +193,7 @@ CFLAGS-pthread_once.c += $(uses-callbacks) -fexceptions \
> CFLAGS-pthread_cond_wait.c += -fexceptions -fasynchronous-unwind-tables
> CFLAGS-sem_wait.c += -fexceptions -fasynchronous-unwind-tables
> CFLAGS-sem_timedwait.c += -fexceptions -fasynchronous-unwind-tables
> +CFLAGS-sem_clockwait.c = -fexceptions -fasynchronous-unwind-tables
>
> # These are the function wrappers we have to duplicate here.
> CFLAGS-fcntl.c += -fexceptions -fasynchronous-unwind-tables
> @@ -262,7 +263,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
> tst-key1 tst-key2 tst-key3 tst-key4 \
> tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 tst-sem7 \
> tst-sem8 tst-sem9 tst-sem10 tst-sem14 \
> - tst-sem15 tst-sem16 \
> + tst-sem15 tst-sem16 tst-sem17 \
> tst-barrier1 tst-barrier2 tst-barrier3 tst-barrier4 \
> tst-align tst-align3 \
> tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \
Ok.
> diff --git a/nptl/Versions b/nptl/Versions
> index e7f691d..cd1806c 100644
> --- a/nptl/Versions
> +++ b/nptl/Versions
> @@ -277,6 +277,10 @@ libpthread {
> cnd_timedwait; cnd_wait; tss_create; tss_delete; tss_get; tss_set;
> }
>
> + GLIBC_2.30 {
> + sem_clockwait;
> + }
> +
> GLIBC_PRIVATE {
> __pthread_initialize_minimal;
> __pthread_clock_gettime; __pthread_clock_settime;
Change to a extension name by adding a _np suffix.
> diff --git a/nptl/sem_clockwait.c b/nptl/sem_clockwait.c
> new file mode 100644
> index 0000000..c0cd667
> --- /dev/null
> +++ b/nptl/sem_clockwait.c
> @@ -0,0 +1,45 @@
> +/* sem_clockwait -- wait on a semaphore with timeout using
> + the specified clock.
> +
> + Copyright (C) 2003-2019 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
I think it should be only 2019 in this case.
> +
> + 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 "sem_waitcommon.c"
> +
> +int
> +sem_clockwait (sem_t *sem, clockid_t clockid,
> + const struct timespec *abstime)
> +{
> + /* Check that supplied clockid is one we support, even if we don't
> + end up waiting. */
> + if (!futex_abstimed_supported_clockid (clockid))
> + {
> + __set_errno (EINVAL);
> + return -1;
> + }
> +
> + if (abstime->tv_nsec < 0 || abstime->tv_nsec >= 1000000000)
> + {
> + __set_errno (EINVAL);
> + return -1;
> + }
> +
> + if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0)
> + return 0;
> + else
> + return __new_sem_wait_slow ((struct new_sem *) sem, clockid, abstime);
> +}
Ok. As for BZ#23006 I think we should follow Austin Group latest resolution
for sem_wait/sem_timedwait and not make it a cancellable entrypoint.
> diff --git a/nptl/sem_timedwait.c b/nptl/sem_timedwait.c
> index 3dd71ab..0918d8b 100644
> --- a/nptl/sem_timedwait.c
> +++ b/nptl/sem_timedwait.c
> @@ -36,5 +36,6 @@ sem_timedwait (sem_t *sem, const struct timespec *abstime)
> if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0)
> return 0;
> else
> - return __new_sem_wait_slow((struct new_sem *) sem, abstime);
> + return __new_sem_wait_slow ((struct new_sem *) sem,
> + CLOCK_REALTIME, abstime);
> }
Ok.
> diff --git a/nptl/sem_wait.c b/nptl/sem_wait.c
> index 6a2d26b..20a8b9d 100644
> --- a/nptl/sem_wait.c
> +++ b/nptl/sem_wait.c
> @@ -39,7 +39,8 @@ __new_sem_wait (sem_t *sem)
> if (__new_sem_wait_fast ((struct new_sem *) sem, 0) == 0)
> return 0;
> else
> - return __new_sem_wait_slow((struct new_sem *) sem, NULL);
> + return __new_sem_wait_slow ((struct new_sem *) sem,
> + CLOCK_REALTIME, NULL);
> }
> versioned_symbol (libpthread, __new_sem_wait, sem_wait, GLIBC_2_1);
>
Ok.
> diff --git a/nptl/sem_waitcommon.c b/nptl/sem_waitcommon.c
> index 425d040..cad56e9 100644
> --- a/nptl/sem_waitcommon.c
> +++ b/nptl/sem_waitcommon.c
> @@ -103,19 +103,19 @@ __sem_wait_cleanup (void *arg)
> users don't seem to need it. */
> static int
> __attribute__ ((noinline))
> -do_futex_wait (struct new_sem *sem, const struct timespec *abstime)
> +do_futex_wait (struct new_sem *sem, clockid_t clockid,
> + const struct timespec *abstime)
> {
> int err;
>
> #if __HAVE_64B_ATOMICS
> err = futex_abstimed_wait_cancelable (
> (unsigned int *) &sem->data + SEM_VALUE_OFFSET, 0,
> - CLOCK_REALTIME, abstime,
> + clockid, abstime,
> sem->private);
> #else
> err = futex_abstimed_wait_cancelable (&sem->value, SEM_NWAITERS_MASK,
> - CLOCK_REALTIME, abstime,
> - sem->private);
> + clockid, abstime, sem->private);
> #endif
>
> return err;
Ok.
> @@ -162,7 +162,8 @@ __new_sem_wait_fast (struct new_sem *sem, int definitive_result)
> /* Slow path that blocks. */
> static int
> __attribute__ ((noinline))
> -__new_sem_wait_slow (struct new_sem *sem, const struct timespec *abstime)
> +__new_sem_wait_slow (struct new_sem *sem, clockid_t clockid,
> + const struct timespec *abstime)
> {
> int err = 0;
>
> @@ -180,7 +181,7 @@ __new_sem_wait_slow (struct new_sem *sem, const struct timespec *abstime)
> /* If there is no token available, sleep until there is. */
> if ((d & SEM_VALUE_MASK) == 0)
> {
> - err = do_futex_wait (sem, abstime);
> + err = do_futex_wait (sem, clockid, abstime);
> /* A futex return value of 0 or EAGAIN is due to a real or spurious
> wake-up, or due to a change in the number of tokens. We retry in
> these cases.
> @@ -281,7 +282,7 @@ __new_sem_wait_slow (struct new_sem *sem, const struct timespec *abstime)
> if ((v >> SEM_VALUE_SHIFT) == 0)
> {
> /* See __HAVE_64B_ATOMICS variant. */
> - err = do_futex_wait(sem, abstime);
> + err = do_futex_wait (sem, clockid, abstime);
> if (err == ETIMEDOUT || err == EINTR)
> {
> __set_errno (err);
Ok.
> diff --git a/nptl/tst-sem13.c b/nptl/tst-sem13.c
> index 28d37ed..21c3b7e 100644
> --- a/nptl/tst-sem13.c
> +++ b/nptl/tst-sem13.c
> @@ -6,9 +6,14 @@
> #include <internaltypes.h>
> #include <support/check.h>
>
> +/* A bogus clock value that tells run_test to use
> + sem_timedwait rather than sem_clockwait */
> +#define CLOCK_USE_TIMEDWAIT (-1)
This defined does not seem to be used.
>
> -static int
> -do_test (void)
> +typedef int (*waitfn_t)(sem_t *, struct timespec *);
> +
> +static void
> +do_test_wait (waitfn_t waitfn, const char *fnname)
> {
> union
> {
> @@ -16,11 +21,13 @@ do_test (void)
> struct new_sem ns;
> } u;
>
> + printf ("do_test_wait: %s\n", fnname);
> +
I think for debug logging it is better to enable only if test_verbose
(support/support_test_main.c:197) is set.
> TEST_COMPARE (sem_init (&u.s, 0, 0), 0);
>
> struct timespec ts = { 0, 1000000001 }; /* Invalid. */
> errno = 0;
> - TEST_VERIFY_EXIT (sem_timedwait (&u.s, &ts) < 0);
> + TEST_VERIFY_EXIT (waitfn (&u.s, &ts) < 0);
> TEST_COMPARE (errno, EINVAL);
>
> #if __HAVE_64B_ATOMICS
> @@ -33,7 +40,7 @@ do_test (void)
> ts.tv_sec = /* Invalid. */ -2;
> ts.tv_nsec = 0;
> errno = 0;
> - TEST_VERIFY_EXIT (sem_timedwait (&u.s, &ts) < 0);
> + TEST_VERIFY_EXIT (waitfn (&u.s, &ts) < 0);
> TEST_COMPARE (errno, ETIMEDOUT);
> #if __HAVE_64B_ATOMICS
> nwaiters = (u.ns.data >> SEM_NWAITERS_SHIFT);
> @@ -41,7 +48,31 @@ do_test (void)
> nwaiters = u.ns.nwaiters;
> #endif
> TEST_COMPARE (nwaiters, 0);
> +}
>
> +int test_sem_timedwait (sem_t *sem, struct timespec *ts)
> +{
> + return sem_timedwait (sem, ts);
> +}
> +
> +int test_sem_clockwait_monotonic (sem_t *sem, struct timespec *ts)
> +{
> + return sem_clockwait (sem, CLOCK_MONOTONIC, ts);
> +}
> +
> +int test_sem_clockwait_realtime (sem_t *sem, struct timespec *ts)
> +{
> + return sem_clockwait (sem, CLOCK_REALTIME, ts);
> +}
> +
> +static int do_test (void)
> +{
> + do_test_wait (&test_sem_timedwait,
> + "sem_timedwait");
> + do_test_wait (&test_sem_clockwait_monotonic,
> + "sem_clockwait(monotonic)");
> + do_test_wait (&test_sem_clockwait_realtime,
> + "sem_clockwait(realtime)");
> return 0;
> }
>
Ok.
> diff --git a/nptl/tst-sem17.c b/nptl/tst-sem17.c
> new file mode 100644
> index 0000000..78c52c8
> --- /dev/null
> +++ b/nptl/tst-sem17.c
> @@ -0,0 +1,76 @@
> +/* Test unsupported/bad clocks passed to sem_clockwait.
> +
> + 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 <errno.h>
> +#include <semaphore.h>
> +#include <stdio.h>
> +#include <time.h>
> +#include <unistd.h>
> +#include <sys/time.h>
> +#include <support/check.h>
> +#include <support/timespec.h>
> +
> +
> +#define NOT_A_VALID_CLOCK 123456
> +
> +static int
> +do_test (void)
> +{
> + sem_t s;
> + TEST_COMPARE (sem_init (&s, 0, 1), 0);
> +
> + const struct timespec ts = make_timespec (0, 0);
> +
> + /* These clocks are meaningless to sem_clockwait. */
> +#if defined(CLOCK_PROCESS_CPUTIME_ID)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_PROCESS_CPUTIME_ID, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +#if defined(CLOCK_THREAD_CPUTIME_ID)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_THREAD_CPUTIME_ID, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +
> + /* These clocks might be meaningful, but are currently unsupported
> + by pthread_cond_clockwait. */
> +#if defined(CLOCK_REALTIME_COARSE)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_REALTIME_COARSE, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +#if defined(CLOCK_MONOTONIC_RAW)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_MONOTONIC_RAW, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +#if defined(CLOCK_MONOTONIC_COARSE)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_MONOTONIC_COARSE, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +#if defined(CLOCK_BOOTTIME)
> + TEST_COMPARE (sem_clockwait (&s, CLOCK_BOOTTIME, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +#endif
> +
> + /* This is a completely invalid clock */
> + TEST_COMPARE (sem_clockwait (&s, NOT_A_VALID_CLOCK, &ts), -1);
> + TEST_COMPARE (errno, EINVAL);
> +
> + return 0;
> +}
> +
> +#include <support/test-driver.c>
Ok.
> diff --git a/nptl/tst-sem5.c b/nptl/tst-sem5.c
> index 396222b..843839b 100644
> --- a/nptl/tst-sem5.c
> +++ b/nptl/tst-sem5.c
> @@ -25,10 +25,15 @@
> #include <support/timespec.h>
> #include <support/xtime.h>
>
> +/* A bogus clock value that tells run_test to use
> + sem_timedwait rather than sem_clockwait */
> +#define CLOCK_USE_TIMEDWAIT (-1)
Maybe use a enum instead of a magic constant ?
>
> -static int
> -do_test (void)
> +static void
> +do_test_clock (clockid_t clockid)
> {
> + const clockid_t clockid_for_get =
> + clockid == CLOCK_USE_TIMEDWAIT ? CLOCK_REALTIME : clockid;
> sem_t s;
> struct timespec ts;
>
> @@ -36,14 +41,22 @@ do_test (void)
> TEST_COMPARE (TEMP_FAILURE_RETRY (sem_wait (&s)), 0);
>
> /* We wait for half a second. */
> - xclock_gettime (CLOCK_REALTIME, &ts);
> + xclock_gettime (clockid_for_get, &ts);
> ts = timespec_add (ts, make_timespec (0, TIMESPEC_HZ/2));
>
> errno = 0;
> - TEST_COMPARE (TEMP_FAILURE_RETRY (sem_timedwait (&s, &ts)), -1);
> + TEST_COMPARE (TEMP_FAILURE_RETRY ((clockid == CLOCK_USE_TIMEDWAIT)
> + ? sem_timedwait (&s, &ts)
> + : sem_clockwait (&s, clockid, &ts)), -1);
> TEST_COMPARE (errno, ETIMEDOUT);
> - TEST_TIMESPEC_NOW_OR_AFTER (CLOCK_REALTIME, ts);
> + TEST_TIMESPEC_NOW_OR_AFTER (clockid_for_get, ts);
> +}
>
> +static int do_test (void)
> +{
> + do_test_clock (CLOCK_USE_TIMEDWAIT);
> + do_test_clock (CLOCK_REALTIME);
> + do_test_clock (CLOCK_MONOTONIC);
> return 0;
> }
>
> diff --git a/sysdeps/pthread/semaphore.h b/sysdeps/pthread/semaphore.h
> index 87c0543..6e74aa3 100644
> --- a/sysdeps/pthread/semaphore.h
> +++ b/sysdeps/pthread/semaphore.h
> @@ -64,6 +64,13 @@ extern int sem_timedwait (sem_t *__restrict __sem,
> __nonnull ((1, 2));
> #endif
>
> +#ifdef __USE_GNU
> +extern int sem_clockwait (sem_t *__restrict __sem,
> + clockid_t clock,
> + const struct timespec *__restrict __abstime)
> + __nonnull ((1, 3));
> +#endif
> +
> /* Test whether SEM is posted. */
> extern int sem_trywait (sem_t *__sem) __THROWNL __nonnull ((1));
>
Naming scheme as described before.
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> index 9a9e4ce..0294cb3 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libpthread.abilist
> @@ -243,3 +243,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> index b413007..1f63759 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libpthread.abilist
> @@ -227,6 +227,7 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.3.2 pthread_cond_broadcast F
> GLIBC_2.3.2 pthread_cond_destroy F
> GLIBC_2.3.2 pthread_cond_init F
> diff --git a/sysdeps/unix/sysv/linux/arm/libpthread.abilist b/sysdeps/unix/sysv/linux/arm/libpthread.abilist
> index af82a4c..905392e 100644
> --- a/sysdeps/unix/sysv/linux/arm/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/libpthread.abilist
> @@ -27,6 +27,7 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 _IO_flockfile F
> GLIBC_2.4 _IO_ftrylockfile F
> GLIBC_2.4 _IO_funlockfile F
> diff --git a/sysdeps/unix/sysv/linux/csky/libpthread.abilist b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> index ea4b79a..fdf577c 100644
> --- a/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libpthread.abilist
> @@ -233,3 +233,4 @@ GLIBC_2.29 tss_set F
> GLIBC_2.29 wait F
> GLIBC_2.29 waitpid F
> GLIBC_2.29 write F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> index bcba07f..fa02154 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libpthread.abilist
> @@ -245,6 +245,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/i386/libpthread.abilist b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> index bece86d..86eb656 100644
> --- a/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libpthread.abilist
> @@ -253,6 +253,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> index ccc9449..406da6f 100644
> --- a/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/ia64/libpthread.abilist
> @@ -247,6 +247,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> index af82a4c..905392e 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libpthread.abilist
> @@ -27,6 +27,7 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 _IO_flockfile F
> GLIBC_2.4 _IO_ftrylockfile F
> GLIBC_2.4 _IO_funlockfile F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> index bece86d..86eb656 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libpthread.abilist
> @@ -253,6 +253,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
> index 5067375..bd9455d 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/libpthread.abilist
> @@ -243,3 +243,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> index 0214496..c1792c5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/libpthread.abilist
> @@ -255,6 +255,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> index 0214496..c1792c5 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/libpthread.abilist
> @@ -255,6 +255,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> index 78cac2a..8eca3c2 100644
> --- a/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/nios2/libpthread.abilist
> @@ -241,3 +241,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> index 09e8447..ca68bd7 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/libpthread.abilist
> @@ -255,6 +255,7 @@ GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> GLIBC_2.3.4 siglongjmp F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> index 8300958..9e0500d 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libpthread.abilist
> @@ -246,6 +246,7 @@ GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> GLIBC_2.3.4 siglongjmp F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> index 9a9e4ce..0294cb3 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libpthread.abilist
> @@ -243,3 +243,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> index c370fda..c6bddf9 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libpthread.abilist
> @@ -235,3 +235,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> index d05468f..581e3be 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libpthread.abilist
> @@ -255,6 +255,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> index e8161aa..ed422c3 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libpthread.abilist
> @@ -247,6 +247,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/sh/libpthread.abilist b/sysdeps/unix/sysv/linux/sh/libpthread.abilist
> index bcba07f..fa02154 100644
> --- a/sysdeps/unix/sysv/linux/sh/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/libpthread.abilist
> @@ -245,6 +245,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> index b413007..e31e905 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libpthread.abilist
> @@ -255,6 +255,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> index ccc9449..406da6f 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libpthread.abilist
> @@ -247,6 +247,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> index 931c827..454d340 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libpthread.abilist
> @@ -245,6 +245,7 @@ GLIBC_2.3.4 pthread_attr_setaffinity_np F
> GLIBC_2.3.4 pthread_getaffinity_np F
> GLIBC_2.3.4 pthread_setaffinity_np F
> GLIBC_2.3.4 pthread_setschedprio F
> +GLIBC_2.30 sem_clockwait F
> GLIBC_2.4 pthread_mutex_consistent_np F
> GLIBC_2.4 pthread_mutex_getprioceiling F
> GLIBC_2.4 pthread_mutex_setprioceiling F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> index c09c9b0..db565a1 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libpthread.abilist
> @@ -243,3 +243,4 @@ GLIBC_2.28 tss_create F
> GLIBC_2.28 tss_delete F
> GLIBC_2.28 tss_get F
> GLIBC_2.28 tss_set F
> +GLIBC_2.30 sem_clockwait F
>