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

Message ID 260b12640f1fa9ef3ce8f60830237d8885e3dc10.1558987219.git-series.mac@mcrowe.com
State Superseded
Headers show
Series
  • Implement POSIX-proposed _clockwait variants of existing _timedwait functions
Related show

Commit Message

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

-- 
git-series 0.9.1

Comments

Adhemerval Zanella June 5, 2019, 9:07 p.m. | #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. | #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. | #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. | #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.

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