Check value of futex before updating in __lll_timedlock
authorBernard Ogden <bernie.ogden@linaro.org>
Mon, 11 Aug 2014 14:26:48 +0000 (15:26 +0100)
committerWill Newton <will.newton@linaro.org>
Tue, 12 Aug 2014 11:57:27 +0000 (12:57 +0100)
2014-08-12  Bernard Ogden  <bernie.ogden@linaro.org>

[BZ #16892]
* sysdeps/nptl/lowlevellock.h (__lll_timedlock): Use
atomic_compare_and_exchange_bool_acq rather than atomic_exchange_acq.

ChangeLog
sysdeps/nptl/lowlevellock.h

index c73d092..a1285a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2014-08-12  Bernard Ogden  <bernie.ogden@linaro.org>
+
+       [BZ #16892]
+       * sysdeps/nptl/lowlevellock.h (__lll_timedlock): Use
+       atomic_compare_and_exchange_bool_acq rather than atomic_exchange_acq.
+
 2014-08-12  Sean Anderson  <seanga2@gmail.com>
 
        * malloc/malloc.c: Fix typo in comment.
index 548a9c8..28f4ba3 100644 (file)
@@ -88,12 +88,15 @@ extern int __lll_timedlock_wait (int *futex, const struct timespec *,
 extern int __lll_robust_timedlock_wait (int *futex, const struct timespec *,
                                        int private) attribute_hidden;
 
+/* Take futex if it is untaken.
+   Otherwise block until either we get the futex or abstime runs out.  */
 #define __lll_timedlock(futex, abstime, private)                \
   ({                                                            \
     int *__futex = (futex);                                     \
     int __val = 0;                                              \
                                                                 \
-    if (__glibc_unlikely (atomic_exchange_acq (__futex, 1)))    \
+    if (__glibc_unlikely                                        \
+        (atomic_compare_and_exchange_bool_acq (__futex, 1, 0))) \
       __val = __lll_timedlock_wait (__futex, abstime, private); \
     __val;                                                      \
   })