From f21754707cf42f18523aafdaad88b8ef3c317e37 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 28 May 2015 15:35:45 -0700 Subject: [PATCH] NaCl: Fix lll_futex_timed_wait timeout calculation. --- ChangeLog | 5 +++++ sysdeps/nacl/lowlevellock-futex.h | 24 ++++++++++++------------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index b68eab5..37dc47b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-05-28 Roland McGrath + + * sysdeps/nacl/lowlevellock-futex.h (lll_futex_timed_wait): + Add TIMEOUT to current time, don't subtract it. + 2015-05-28 H.J. Lu [BZ #18422] diff --git a/sysdeps/nacl/lowlevellock-futex.h b/sysdeps/nacl/lowlevellock-futex.h index 8d888a2..b614ac8 100644 --- a/sysdeps/nacl/lowlevellock-futex.h +++ b/sysdeps/nacl/lowlevellock-futex.h @@ -40,26 +40,26 @@ /* Wait until a lll_futex_wake call on FUTEXP, or TIMEOUT elapses. */ #define lll_futex_timed_wait(futexp, val, timeout, private) \ ({ \ - /* This timeout is relative, but the IRT call wants it absolute. */ \ + /* This timeout is relative, but the IRT call wants it absolute. */\ const struct timespec *_to = (timeout); \ struct timespec _ts; \ int _err = 0; \ if (_to != NULL \ - && __glibc_likely ((_err = __nacl_irt_clock.clock_gettime \ - (CLOCK_REALTIME, &_ts)) == 0)) \ + && __glibc_likely ((_err = __nacl_irt_clock.clock_gettime \ + (CLOCK_REALTIME, &_ts)) == 0)) \ { \ - _ts.tv_sec -= _to->tv_sec; \ - _ts.tv_nsec -= _to->tv_nsec; \ - while (_ts.tv_nsec < 0) \ - { \ - _ts.tv_nsec += 1000000000; \ - --_ts.tv_sec; \ - } \ - _to = &_ts; \ + _ts.tv_sec += _to->tv_sec; \ + _ts.tv_nsec += _to->tv_nsec; \ + while (_ts.tv_nsec >= 1000000000) \ + { \ + _ts.tv_nsec -= 1000000000; \ + ++_ts.tv_sec; \ + } \ + _to = &_ts; \ } \ if (_err == 0) \ _err = __nacl_irt_futex.futex_wait_abs \ - ((volatile int *) (futexp), val, _to); \ + ((volatile int *) (futexp), val, _to); \ -_err; \ }) -- 2.7.4