diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-11-25 17:15:51 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-11-27 09:59:13 -0300 |
commit | 71eeae0325a95f5e5d7ec4a27a6a6c357e0c8ef4 (patch) | |
tree | 470fe6a8c1ab863ad0c400d6e19924c2d265ac68 /nptl/pthread_mutex_timedlock.c | |
parent | 9ff2674ef82eccd5ae5dfa6bb733c0e3613764c6 (diff) | |
download | glibc-71eeae0325a95f5e5d7ec4a27a6a6c357e0c8ef4.tar.gz glibc-71eeae0325a95f5e5d7ec4a27a6a6c357e0c8ef4.tar.xz glibc-71eeae0325a95f5e5d7ec4a27a6a6c357e0c8ef4.zip |
nptl: Fix PTHREAD_PRIO_PROTECT timed lock
The 878fe624d4 changed lll_futex_timed_wait, which expects a relative timeout, with a __futex_abstimed_wait64, which expects an absolute timeout. However the code still passes a relative timeout. Also, the PTHREAD_PRIO_PROTECT support for clocks different than CLOCK_REALTIME was broken since the inclusion of pthread_mutex_clocklock (9d20e22e46) since lll_futex_timed_wait always use CLOCK_REALTIME. This patch fixes by removing the relative time calculation. It also adds some xtests that tests both thread and inter-process usage. Checked on x86_64-linux-gnu.
Diffstat (limited to 'nptl/pthread_mutex_timedlock.c')
-rw-r--r-- | nptl/pthread_mutex_timedlock.c | 29 |
1 files changed, 5 insertions, 24 deletions
diff --git a/nptl/pthread_mutex_timedlock.c b/nptl/pthread_mutex_timedlock.c index aaaafa21ce..74adffe790 100644 --- a/nptl/pthread_mutex_timedlock.c +++ b/nptl/pthread_mutex_timedlock.c @@ -547,30 +547,11 @@ __pthread_mutex_clocklock_common (pthread_mutex_t *mutex, goto failpp; } - struct __timespec64 rt; - - /* Get the current time. */ - __clock_gettime64 (CLOCK_REALTIME, &rt); - - /* Compute relative timeout. */ - rt.tv_sec = abstime->tv_sec - rt.tv_sec; - rt.tv_nsec = abstime->tv_nsec - rt.tv_nsec; - if (rt.tv_nsec < 0) - { - rt.tv_nsec += 1000000000; - --rt.tv_sec; - } - - /* Already timed out? */ - if (rt.tv_sec < 0) - { - result = ETIMEDOUT; - goto failpp; - } - - __futex_abstimed_wait64 ( - (unsigned int *) &mutex->__data.__lock, clockid, - ceilval | 2, &rt, PTHREAD_MUTEX_PSHARED (mutex)); + int e = __futex_abstimed_wait64 ( + (unsigned int *) &mutex->__data.__lock, ceilval | 2, + clockid, abstime, PTHREAD_MUTEX_PSHARED (mutex)); + if (e == ETIMEDOUT) + return ETIMEDOUT; } } while (atomic_compare_and_exchange_val_acq (&mutex->__data.__lock, |