NaCl: Fix lll_futex_timed_wait timeout calculation.
authorRoland McGrath <roland@hack.frob.com>
Thu, 28 May 2015 22:35:45 +0000 (15:35 -0700)
committerRoland McGrath <roland@hack.frob.com>
Thu, 28 May 2015 22:35:45 +0000 (15:35 -0700)
ChangeLog
sysdeps/nacl/lowlevellock-futex.h

index b68eab5..37dc47b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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]
index 8d888a2..b614ac8 100644 (file)
 /* 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;                                                              \
   })