From: Roland McGrath Date: Thu, 28 May 2015 22:35:45 +0000 (-0700) Subject: NaCl: Fix lll_futex_timed_wait timeout calculation. X-Git-Tag: glibc-2.22~257 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f21754707cf42f18523aafdaad88b8ef3c317e37;p=thirdparty%2Fglibc.git NaCl: Fix lll_futex_timed_wait timeout calculation. --- diff --git a/ChangeLog b/ChangeLog index b68eab55c56..37dc47b206f 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 8d888a2e722..b614ac8183f 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; \ })