(atomic_decrement_if_positive): Adjust for the correct atomic_compare_and_exchange_acq semantics.

This commit is contained in:
Ulrich Drepper 2003-03-20 19:42:54 +00:00
parent f1f8a9ec6f
commit 972209dd7a
1 changed files with 9 additions and 10 deletions

View File

@ -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