Message ID | 97caa1cf132e59a66fe1e830b033783695e3617a.1560875584.git-series.mac@mcrowe.com |
---|---|
State | New |
Headers | show |
Series | nptl: Implement POSIX-proposed _clock variants of existing _timed functions | expand |
On 18/06/2019 13:33, 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. > > * 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. LGTM with just one nit below regarding alpha abilist (I will fix it prior push). The change seems to align with proposed Android addition [1]. [1] https://android-review.googlesource.com/c/platform/bionic/+/958058 > --- > 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 dc84553..33502da 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 This is not in correct position, it should should be after GLIBC_2.3.2 entries. > 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 >
On Friday 21 June 2019 at 13:02:42 -0300, Adhemerval Zanella wrote: > > > On 18/06/2019 13:33, 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. > > > > * 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. > > LGTM with just one nit below regarding alpha abilist (I will fix it prior > push). Thanks. I must have done alpha by hand a long time ago. I still need to investigate the automated way to add these that you mentioned recently. > The change seems to align with proposed Android addition [1]. > > [1] https://android-review.googlesource.com/c/platform/bionic/+/958058 Yes. I've been coordinating with Tom. He's very keen to get these new functions in too. Mike.
diff --git a/ChangeLog b/ChangeLog index dc84553..33502da 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