[v3,2/6] nptl: Add POSIX-proposed sem_clockwait

Message ID 260b12640f1fa9ef3ce8f60830237d8885e3dc10.1558987219.git-series.mac@mcrowe.com
State Superseded
Headers

Commit Message

Mike Crowe May 27, 2019, 8:03 p.m. UTC
  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.

* 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
  

Comments

Adhemerval Zanella June 5, 2019, 9:07 p.m. UTC | #1
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
>
  
Mike Crowe June 6, 2019, 3:40 p.m. UTC | #2
On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
> 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.

Hi Adhemerval,

I thought we went through this before[1] and agreed that the _np suffix wasn't
necessary in this case. However, I couldn't find a reply to Florian
agreeing to that.

[1] https://marc.info/?l=glibc-alpha&m=155256303513500

[snip other helpful review comments that I will work on]

> > +
> > +   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.

I think that's what I've done here (perhaps purely by accident because I'd
probably copied the code prior to
47677f2edc815e85d0383a89b09733e95e5d7302.) Would you like me to add a
comment to describe why there's no call to __pthread_test_cancel() here?

> > 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 ?

Do you mean just:

enum { CLOCK_USE_TIMEDWAIT = -1 };

or something like:

enum
{
  CLOCK_MONOTONIC_ = CLOCK_MONOTONIC,
  CLOCK_REALTIME_ = CLOCK_REALTIME,
  CLOCK_USE_TIMEDWAIT
};

in attempt to ensure that CLOCK_USE_TIMEDWAIT doesn't overlap? I can't see
how this can work with potentially-arbitrary values for CLOCK_MONOTONIC and
CLOCK_REALTIME. This would fail if CLOCK_REALTIME=42 and
CLOCK_MONOTONIC=43.

Since glibc is responsible declaring CLOCK_MONOTONIC and CLOCK_REALTIME, and can't change
them without breaking ABI, I thought -1 would be safe. If we're worried, I
could add explicit checks that CLOCK_USE_TIMEDWAIT doesn't have the same
value as CLOCK_MONOTONIC or CLOCK_REALTIME.

Thanks.

Mike.
  
Adhemerval Zanella June 6, 2019, 5:43 p.m. UTC | #3
On 06/06/2019 12:40, Mike Crowe wrote:
> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>> 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.
> 
> Hi Adhemerval,
> 
> I thought we went through this before[1] and agreed that the _np suffix wasn't
> necessary in this case. However, I couldn't find a reply to Florian
> agreeing to that.
> 
> [1] https://marc.info/?l=glibc-alpha&m=155256303513500
> 
> [snip other helpful review comments that I will work on]

I take it is rule of thumb to add names different than the expected one from
standard, but I don't have a strong opinion here.

The posix_spawn, for instance, were added to mimic the other system names 
(Solaris in this case) and the name originally were added with the extension 
to make it explicit it a non-portable extension. But Solaris also did not
seem to work towards to make it POSIX standard, so it might the reason to
it.

> 
>>> +
>>> +   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.
> 
> I think that's what I've done here (perhaps purely by accident because I'd
> probably copied the code prior to
> 47677f2edc815e85d0383a89b09733e95e5d7302.) Would you like me to add a
> comment to describe why there's no call to __pthread_test_cancel() here?

Yes, please do.

> 
>>> 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 ?
> 
> Do you mean just:
> 
> enum { CLOCK_USE_TIMEDWAIT = -1 };
> 
> or something like:
> 
> enum
> {
>   CLOCK_MONOTONIC_ = CLOCK_MONOTONIC,
>   CLOCK_REALTIME_ = CLOCK_REALTIME,
>   CLOCK_USE_TIMEDWAIT
> };
> 
> in attempt to ensure that CLOCK_USE_TIMEDWAIT doesn't overlap? I can't see
> how this can work with potentially-arbitrary values for CLOCK_MONOTONIC and
> CLOCK_REALTIME. This would fail if CLOCK_REALTIME=42 and
> CLOCK_MONOTONIC=43.
> 
> Since glibc is responsible declaring CLOCK_MONOTONIC and CLOCK_REALTIME, and can't change
> them without breaking ABI, I thought -1 would be safe. If we're worried, I
> could add explicit checks that CLOCK_USE_TIMEDWAIT doesn't have the same
> value as CLOCK_MONOTONIC or CLOCK_REALTIME.

Yeah, I think this over-engineering is not really required.

> 
> Thanks.
> 
> Mike.
>
  
Adhemerval Zanella June 6, 2019, 7:20 p.m. UTC | #4
On 06/06/2019 14:43, Adhemerval Zanella wrote:
> 
> 
> On 06/06/2019 12:40, Mike Crowe wrote:
>> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>>> 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.
>>
>> Hi Adhemerval,
>>
>> I thought we went through this before[1] and agreed that the _np suffix wasn't
>> necessary in this case. However, I couldn't find a reply to Florian
>> agreeing to that.
>>
>> [1] https://marc.info/?l=glibc-alpha&m=155256303513500
>>
>> [snip other helpful review comments that I will work on]
> 
> I take it is rule of thumb to add names different than the expected one from
> standard, but I don't have a strong opinion here.
> 
> The posix_spawn, for instance, were added to mimic the other system names 
> (Solaris in this case) and the name originally were added with the extension 
> to make it explicit it a non-portable extension. But Solaris also did not
> seem to work towards to make it POSIX standard, so it might the reason to
> it.

Joseph added on IRC that we should add the symbols with the expected naming, 
but remember there might be future incompatibilities requiring symbol versioning.
I think it would be fine as well.
  
Florian Weimer June 25, 2019, 6:06 p.m. UTC | #5
* Mike Crowe:

> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>> 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.

> I thought we went through this before[1] and agreed that the _np suffix wasn't
> necessary in this case. However, I couldn't find a reply to Florian
> agreeing to that.

Upon second thought, I agree with Adhemerval here.  We should use a
function with the _np suffix, otherwise we'll be in a world of pain if
something else is standardized.

Thanks,
Florian
  
Mike Crowe June 25, 2019, 7:19 p.m. UTC | #6
On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
> * Mike Crowe:
> 
> > On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
> >> 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.
> 
> > I thought we went through this before[1] and agreed that the _np suffix wasn't
> > necessary in this case. However, I couldn't find a reply to Florian
> > agreeing to that.
> 
> Upon second thought, I agree with Adhemerval here.  We should use a
> function with the _np suffix, otherwise we'll be in a world of pain if
> something else is standardized.

Well, the plan is to standardise this[1] and The Austin Group are the ones
who decided on the names, but there needs to be an implementation before
that can happen. Presumably that implementation can have _np suffixes in
the short term though.

I shall apply some sed to the patch series and repost.

Thanks.

Mike.

[1] http://austingroupbugs.net/view.php?id=1216
  
Florian Weimer June 25, 2019, 9:39 p.m. UTC | #7
* Mike Crowe:

> On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
>> * Mike Crowe:
>> 
>> > On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>> >> 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.
>> 
>> > I thought we went through this before[1] and agreed that the _np suffix wasn't
>> > necessary in this case. However, I couldn't find a reply to Florian
>> > agreeing to that.
>> 
>> Upon second thought, I agree with Adhemerval here.  We should use a
>> function with the _np suffix, otherwise we'll be in a world of pain if
>> something else is standardized.
>
> Well, the plan is to standardise this[1] and The Austin Group are the ones
> who decided on the names, but there needs to be an implementation before
> that can happen. Presumably that implementation can have _np suffixes in
> the short term though.
>
> I shall apply some sed to the patch series and repost.

Sorry, I see that we don't use _np for the other functions.
I'm confused now. 8-(

Adhemerval, is there value in keeping this consistent?  Have these
functions progressed to different stages in the POSIX process?

Thanks,
Florian
  
Adhemerval Zanella June 25, 2019, 10:07 p.m. UTC | #8
On 25/06/2019 18:39, Florian Weimer wrote:
> * Mike Crowe:
> 
>> On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
>>> * Mike Crowe:
>>>
>>>> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>>>>> 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.
>>>
>>>> I thought we went through this before[1] and agreed that the _np suffix wasn't
>>>> necessary in this case. However, I couldn't find a reply to Florian
>>>> agreeing to that.
>>>
>>> Upon second thought, I agree with Adhemerval here.  We should use a
>>> function with the _np suffix, otherwise we'll be in a world of pain if
>>> something else is standardized.
>>
>> Well, the plan is to standardise this[1] and The Austin Group are the ones
>> who decided on the names, but there needs to be an implementation before
>> that can happen. Presumably that implementation can have _np suffixes in
>> the short term though.
>>
>> I shall apply some sed to the patch series and repost.
> 
> Sorry, I see that we don't use _np for the other functions.
> I'm confused now. 8-(
> 
> Adhemerval, is there value in keeping this consistent?  Have these
> functions progressed to different stages in the POSIX process?

My understanding of Austin proposal [1] (Mike can correct me) is naming is
settled and Android will also probably follow the same naming scheme. However, 
since Austin Group does not really propose newer interfaces, they
required a actual implementation to move forward.

Joseph also added sometime ago on IRC that we should add the symbols with 
the expected naming, but keep in mind there might be future incompatibilities 
requiring symbol versioning.

[1] http://austingroupbugs.net/view.php?id=1216
  
Florian Weimer June 26, 2019, 1:02 p.m. UTC | #9
* Adhemerval Zanella:

> On 25/06/2019 18:39, Florian Weimer wrote:
>> * Mike Crowe:
>> 
>>> On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
>>>> * Mike Crowe:
>>>>
>>>>> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>>>>>> 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.
>>>>
>>>>> I thought we went through this before[1] and agreed that the _np suffix wasn't
>>>>> necessary in this case. However, I couldn't find a reply to Florian
>>>>> agreeing to that.
>>>>
>>>> Upon second thought, I agree with Adhemerval here.  We should use a
>>>> function with the _np suffix, otherwise we'll be in a world of pain if
>>>> something else is standardized.
>>>
>>> Well, the plan is to standardise this[1] and The Austin Group are the ones
>>> who decided on the names, but there needs to be an implementation before
>>> that can happen. Presumably that implementation can have _np suffixes in
>>> the short term though.
>>>
>>> I shall apply some sed to the patch series and repost.
>> 
>> Sorry, I see that we don't use _np for the other functions.
>> I'm confused now. 8-(
>> 
>> Adhemerval, is there value in keeping this consistent?  Have these
>> functions progressed to different stages in the POSIX process?
>
> My understanding of Austin proposal [1] (Mike can correct me) is naming is
> settled and Android will also probably follow the same naming scheme. However, 
> since Austin Group does not really propose newer interfaces, they
> required a actual implementation to move forward.
>
> Joseph also added sometime ago on IRC that we should add the symbols with 
> the expected naming, but keep in mind there might be future incompatibilities 
> requiring symbol versioning.
>
> [1] http://austingroupbugs.net/view.php?id=1216

I'm still puzzled what's different compared to
posix_spawn_file_actions_addfchdir_np or pthread_rwlock_clockrdlock.
Are they at different stages of the POSIX process?

Thanks,
Florian
  
Mike Crowe June 26, 2019, 1:47 p.m. UTC | #10
On Wednesday 26 June 2019 at 15:02:44 +0200, Florian Weimer wrote:
> * Adhemerval Zanella:
> 
> > On 25/06/2019 18:39, Florian Weimer wrote:
> >> * Mike Crowe:
> >> 
> >>> On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
> >>>> * Mike Crowe:
> >>>>
> >>>>> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
> >>>>>> 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.
> >>>>
> >>>>> I thought we went through this before[1] and agreed that the _np suffix wasn't
> >>>>> necessary in this case. However, I couldn't find a reply to Florian
> >>>>> agreeing to that.
> >>>>
> >>>> Upon second thought, I agree with Adhemerval here.  We should use a
> >>>> function with the _np suffix, otherwise we'll be in a world of pain if
> >>>> something else is standardized.
> >>>
> >>> Well, the plan is to standardise this[1] and The Austin Group are the ones
> >>> who decided on the names, but there needs to be an implementation before
> >>> that can happen. Presumably that implementation can have _np suffixes in
> >>> the short term though.
> >>>
> >>> I shall apply some sed to the patch series and repost.
> >> 
> >> Sorry, I see that we don't use _np for the other functions.
> >> I'm confused now. 8-(
> >> 
> >> Adhemerval, is there value in keeping this consistent?  Have these
> >> functions progressed to different stages in the POSIX process?
> >
> > My understanding of Austin proposal [1] (Mike can correct me) is naming is
> > settled and Android will also probably follow the same naming scheme. However, 
> > since Austin Group does not really propose newer interfaces, they
> > required a actual implementation to move forward.
> >
> > Joseph also added sometime ago on IRC that we should add the symbols with 
> > the expected naming, but keep in mind there might be future incompatibilities 
> > requiring symbol versioning.
> >
> > [1] http://austingroupbugs.net/view.php?id=1216
> 
> I'm still puzzled what's different compared to
> posix_spawn_file_actions_addfchdir_np or pthread_rwlock_clockrdlock.
> Are they at different stages of the POSIX process?

I'm not sure what stage posix_spawn_file_actions_addfchdir (which appears
to be http://austingroupbugs.net/view.php?id=1208 ) is at, but it looks
like Eric Blake added it with the _np suffix prior to seeking
standardisation.

I attended an Austin Group teleconference (minutes at
https://www.opengroup.org/austin/docs/austin_895.txt ) late last year and I
believe that there was consensus in favour. We haven't yet determined which
track to use to get the functions into POSIX - I've been focusing on the
implementation.

If people would feel happier with using _np suffixes for now, then I think
we should add them. However, my next step after this series lands (if it
does) is to get a change into libstdc++ to use pthread_cond_clockwait{,_np}
so we'd have to keep the _np versions around for quite a while even after
the non-_np versions are standardised. libstdc++ would need to support
either name in parallel for a while too.

If it would be sufficient, we could delay landing the series while I try
confirming with The Austin Group that they are definitely happy with the
naming and parameters of the new functions. (There's a meeting tomorrow,
and I may be able to get it on the agenda.)

Thanks.

Mike.
  
Adhemerval Zanella June 26, 2019, 5:18 p.m. UTC | #11
On 26/06/2019 10:47, Mike Crowe wrote:
> On Wednesday 26 June 2019 at 15:02:44 +0200, Florian Weimer wrote:
>> * Adhemerval Zanella:
>>
>>> On 25/06/2019 18:39, Florian Weimer wrote:
>>>> * Mike Crowe:
>>>>
>>>>> On Tuesday 25 June 2019 at 20:06:53 +0200, Florian Weimer wrote:
>>>>>> * Mike Crowe:
>>>>>>
>>>>>>> On Wednesday 05 June 2019 at 18:07:18 -0300, Adhemerval Zanella wrote:
>>>>>>>> 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.
>>>>>>
>>>>>>> I thought we went through this before[1] and agreed that the _np suffix wasn't
>>>>>>> necessary in this case. However, I couldn't find a reply to Florian
>>>>>>> agreeing to that.
>>>>>>
>>>>>> Upon second thought, I agree with Adhemerval here.  We should use a
>>>>>> function with the _np suffix, otherwise we'll be in a world of pain if
>>>>>> something else is standardized.
>>>>>
>>>>> Well, the plan is to standardise this[1] and The Austin Group are the ones
>>>>> who decided on the names, but there needs to be an implementation before
>>>>> that can happen. Presumably that implementation can have _np suffixes in
>>>>> the short term though.
>>>>>
>>>>> I shall apply some sed to the patch series and repost.
>>>>
>>>> Sorry, I see that we don't use _np for the other functions.
>>>> I'm confused now. 8-(
>>>>
>>>> Adhemerval, is there value in keeping this consistent?  Have these
>>>> functions progressed to different stages in the POSIX process?
>>>
>>> My understanding of Austin proposal [1] (Mike can correct me) is naming is
>>> settled and Android will also probably follow the same naming scheme. However, 
>>> since Austin Group does not really propose newer interfaces, they
>>> required a actual implementation to move forward.
>>>
>>> Joseph also added sometime ago on IRC that we should add the symbols with 
>>> the expected naming, but keep in mind there might be future incompatibilities 
>>> requiring symbol versioning.
>>>
>>> [1] http://austingroupbugs.net/view.php?id=1216
>>
>> I'm still puzzled what's different compared to
>> posix_spawn_file_actions_addfchdir_np or pthread_rwlock_clockrdlock.
>> Are they at different stages of the POSIX process?
> 
> I'm not sure what stage posix_spawn_file_actions_addfchdir (which appears
> to be http://austingroupbugs.net/view.php?id=1208 ) is at, but it looks
> like Eric Blake added it with the _np suffix prior to seeking
> standardisation.

My guess is to make it follow Solaris11 implementation which added the symbol
with _np suffix. The POSIX was accepte with the expected name, so eventually
both Solaris and glibc will need to provide the symbol with the expected
name.

> 
> I attended an Austin Group teleconference (minutes at
> https://www.opengroup.org/austin/docs/austin_895.txt ) late last year and I
> believe that there was consensus in favour. We haven't yet determined which
> track to use to get the functions into POSIX - I've been focusing on the
> implementation.
> 
> If people would feel happier with using _np suffixes for now, then I think
> we should add them. However, my next step after this series lands (if it
> does) is to get a change into libstdc++ to use pthread_cond_clockwait{,_np}
> so we'd have to keep the _np versions around for quite a while even after
> the non-_np versions are standardised. libstdc++ would need to support
> either name in parallel for a while too.

Once it set on libc abi we can't remove without bump the major version (and
this is troublesome and it would require time). I would prefer to not add
with _np just because it will most likely add needless complexity on 
libstdc++ side (or any other project) to check for multiples names for the 
same functionality.

> 
> If it would be sufficient, we could delay landing the series while I try
> confirming with The Austin Group that they are definitely happy with the
> naming and parameters of the new functions. (There's a meeting tomorrow,
> and I may be able to get it on the agenda.)

I don't have a strong opinion, but I think it would be good to land on 2.30.
I have the remaining patchset set for inclusion in my user branch and from 
Austin Group procedures I think is unlikely they will change the naming, 
specially for a non default _np or even after glibc provides the required 
actual implementation.
  

Patch

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
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 \
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;
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.
+
+   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);
+}
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);
 }
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);
 
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;
@@ -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);
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)
 
-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);
+
   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;
 }
 
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>
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)
 
-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));
 
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