NaCl: Fix lll_futex_timed_wait timeout calculation.

This commit is contained in:
Roland McGrath 2015-05-28 15:35:45 -07:00
parent 58007e9e68
commit f21754707c
2 changed files with 17 additions and 12 deletions

View File

@ -1,3 +1,8 @@
2015-05-28 Roland McGrath <roland@hack.frob.com>
* sysdeps/nacl/lowlevellock-futex.h (lll_futex_timed_wait):
Add TIMEOUT to current time, don't subtract it.
2015-05-28 H.J. Lu <hongjiu.lu@intel.com>
[BZ #18422]

View File

@ -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; \
})