aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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