Hi Adhemerval, > Changes from previous version: > > - Replace ENOTSUP by EINVAL > > -- > > Linux futex FUTEX_LOCK_PI operation only supports CLOCK_REALTIME, > so pthread_mutex_clocklock operation with priority aware mutexes > may fail depending of the input timeout. > > Also, it is not possible to convert a CLOCK_MONOTONIC to a > CLOCK_REALTIME due the possible wall clock time change which might > invalid the requested timeout. > > Checked on x86_64-linux-gnu and i686-linux-gnu. > --- > nptl/Makefile | 2 +- > nptl/pthread_mutex_timedlock.c | 7 ++++ > nptl/tst-mutexpi10.c | 68 > ++++++++++++++++++++++++++++++++++ sysdeps/pthread/tst-mutex5.c | > 2 + sysdeps/pthread/tst-mutex9.c | 2 + > 5 files changed, 80 insertions(+), 1 deletion(-) > create mode 100644 nptl/tst-mutexpi10.c > > diff --git a/nptl/Makefile b/nptl/Makefile > index 968768d33b..a48426a396 100644 > --- a/nptl/Makefile > +++ b/nptl/Makefile > @@ -265,7 +265,7 @@ tests = tst-attr2 tst-attr3 tst-default-attr \ > tst-mutex5a tst-mutex7a \ > tst-mutexpi1 tst-mutexpi2 tst-mutexpi3 tst-mutexpi4 \ > tst-mutexpi5 tst-mutexpi5a tst-mutexpi6 tst-mutexpi7 > tst-mutexpi7a \ > - tst-mutexpi9 \ > + tst-mutexpi9 tst-mutexpi10 \ > tst-cond22 tst-cond26 \ > tst-robustpi1 tst-robustpi2 tst-robustpi3 tst-robustpi4 > tst-robustpi5 \ tst-robustpi6 tst-robustpi7 tst-robustpi9 \ > diff --git a/nptl/pthread_mutex_timedlock.c > b/nptl/pthread_mutex_timedlock.c index b42862193a..aaaafa21ce 100644 > --- a/nptl/pthread_mutex_timedlock.c > +++ b/nptl/pthread_mutex_timedlock.c > @@ -313,6 +313,13 @@ __pthread_mutex_clocklock_common > (pthread_mutex_t *mutex, case PTHREAD_MUTEX_PI_ROBUST_NORMAL_NP: > case PTHREAD_MUTEX_PI_ROBUST_ADAPTIVE_NP: > { > + /* Currently futex FUTEX_LOCK_PI operation only provides > support for > + CLOCK_REALTIME and trying to emulate by converting a > + CLOCK_MONOTONIC to CLOCK_REALTIME will take in account > possible > + changes to the wall clock. */ > + if (__glibc_unlikely (clockid != CLOCK_REALTIME)) > + return EINVAL; > + > int kind, robust; > { > /* See concurrency notes regarding __kind in struct > __pthread_mutex_s diff --git a/nptl/tst-mutexpi10.c > b/nptl/tst-mutexpi10.c new file mode 100644 > index 0000000000..84ba1dfa97 > --- /dev/null > +++ b/nptl/tst-mutexpi10.c > @@ -0,0 +1,68 @@ > +/* Check if pthread_mutex_clocklock with PRIO_INHERIT fails with > clock > + different than CLOCK_REALTIME. > + Copyright (C) 2015-2020 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 > + . */ > + > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +static int > +do_test (void) > +{ > + const int types[] = { > + PTHREAD_MUTEX_NORMAL, > + PTHREAD_MUTEX_ERRORCHECK, > + PTHREAD_MUTEX_RECURSIVE, > + PTHREAD_MUTEX_ADAPTIVE_NP > + }; > + const int robust[] = { > + PTHREAD_MUTEX_STALLED, > + PTHREAD_MUTEX_ROBUST > + }; > + > + > + for (int t = 0; t < array_length (types); t++) > + for (int r = 0; r < array_length (robust); r++) > + { > + pthread_mutexattr_t attr; > + > + xpthread_mutexattr_init (&attr); > + xpthread_mutexattr_setprotocol (&attr, PTHREAD_PRIO_INHERIT); > + xpthread_mutexattr_settype (&attr, types[t]); > + xpthread_mutexattr_setrobust (&attr, robust[r]); > + > + pthread_mutex_t mtx; > + xpthread_mutex_init (&mtx, &attr); > + > + struct timespec tmo = timespec_add (xclock_now > (CLOCK_MONOTONIC), > + make_timespec (0, > 100000000)); + > + TEST_COMPARE (pthread_mutex_clocklock (&mtx, > CLOCK_MONOTONIC, &tmo), > + EINVAL); > + > + xpthread_mutex_destroy (&mtx); > + } > + > + return 0; > +} > + > +#include > diff --git a/sysdeps/pthread/tst-mutex5.c > b/sysdeps/pthread/tst-mutex5.c index 14490768c3..bfe1a79fa4 100644 > --- a/sysdeps/pthread/tst-mutex5.c > +++ b/sysdeps/pthread/tst-mutex5.c > @@ -112,7 +112,9 @@ static int do_test (void) > { > do_test_clock (CLOCK_USE_TIMEDLOCK, "timedlock"); > do_test_clock (CLOCK_REALTIME, "clocklock(realtime)"); > +#ifndef ENABLE_PI > do_test_clock (CLOCK_MONOTONIC, "clocklock(monotonic)"); > +#endif > return 0; > } > > diff --git a/sysdeps/pthread/tst-mutex9.c > b/sysdeps/pthread/tst-mutex9.c index 2d7927b7c2..bfc01f8c75 100644 > --- a/sysdeps/pthread/tst-mutex9.c > +++ b/sysdeps/pthread/tst-mutex9.c > @@ -133,7 +133,9 @@ do_test (void) > { > do_test_clock (CLOCK_USE_TIMEDLOCK); > do_test_clock (CLOCK_REALTIME); > +#ifndef ENABLE_PI > do_test_clock (CLOCK_MONOTONIC); > +#endif > return 0; > } > Reviewed-by: Lukasz Majewski Best regards, Lukasz Majewski -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de