about summary refs log tree commit diff
path: root/include/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/atomic.h')
-rw-r--r--include/atomic.h19
1 files changed, 9 insertions, 10 deletions
diff --git a/include/atomic.h b/include/atomic.h
index 87b2df8d21..f0cc8cb643 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -113,22 +113,21 @@
 
 /* Decrement *MEM if it is > 0, and return the old value.  */
 #ifndef atomic_decrement_if_positive
-# define atomic_decrement_if_positive(mem)				      \
-  ({ __typeof (*mem) __val;						      \
-     __typeof (*mem) __oldval;						      \
+# define atomic_decrement_if_positive(mem) \
+  ({ __typeof (*mem) __oldval;						      \
      __typeof (mem) __memp;						      \
-     									      \
+									      \
      __val = *__memp;							      \
      do									      \
        {								      \
-	 if (__builtin_expect (__val <= 0, 0))				      \
+	 __oldval = *__memp;						      \
+	 if (__builtin_expect (__oldval <= 0, 0))			      \
 	   break;							      \
-	 __oldval = __val;						      \
-	 __val = atomic_compare_and_exchange_acq (__memp, __oldval - 1,	      \
-						  __oldval);		      \
        }								      \
-     while (__builtin_expect (__val != __oldval, 0));			      \
-     __val; })
+     while (__builtin_expect (atomic_compare_and_exchange_acq (__memp,	      \
+							       __oldval - 1,  \
+							       __oldval), 0));\
+     __oldval; })
 #endif