diff options
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/ChangeLog | 3 | ||||
-rw-r--r-- | nptl/atomic.h | 50 |
2 files changed, 42 insertions, 11 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog index f018cccbb3..215ec8d495 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,6 +1,7 @@ 2003-02-04 Ulrich Drepper <drepper@redhat.com> - * atomic.h (atomic_compare_and_exchange_acq): Use + * atomic.h: Add a couple more default implementations. + (atomic_compare_and_exchange_acq): Use __arch_compare_and_exchange_32_acq in return value definition. It always exists. (atomic_bit_set): Renamed from atomic_set_bit. diff --git a/nptl/atomic.h b/nptl/atomic.h index c8ea95f834..85a43c01e6 100644 --- a/nptl/atomic.h +++ b/nptl/atomic.h @@ -60,7 +60,7 @@ while (atomic_compare_and_exchange_acq (__memp, __oldval + __value, \ __oldval)); \ \ - __value; }) + __oldval; }) #endif @@ -74,23 +74,53 @@ #endif +#ifndef atomic_increment_and_test +# define atomic_increment_and_test(mem) \ + (atomic_exchange_and_add (mem, 1) == 0) +#endif + + #ifndef atomic_decrement # define atomic_decrement(mem) atomic_add (mem, -1) #endif +#ifndef atomic_decrement_and_test +# define atomic_decrement_and_test(mem) \ + (atomic_exchange_and_add (mem, -1) == 0) +#endif + + +#ifdef atomic_add_negative +# define atomic_add_negative(mem, value) \ + (atomic_exchange_and_add (mem, value) < 0) +#endif + + +#ifndef atomic_add_zero +# define atomic_add_zero(mem, value) \ + (atomic_exchange_and_add (mem, value) == 0) +#endif + + #ifndef atomic_bit_set # define atomic_bit_set(mem, bit) \ - (void) ({ __typeof (mem) __memp = (mem); \ - __typeof (*mem) __mask = (1 << (bit)); \ - __typeof (*mem) __oldval; \ + (void) atomic_bit_test_set(mem, bit) +#endif + + +#ifndef atomic_bit_test_set +# define atomic_bit_test_set(mem, bit) \ + ({ __typeof (*mem) __oldval; \ + __typeof (mem) __memp = (mem); \ + __typeof (*mem) __mask = (1 << (bit)); \ + \ + do \ + __oldval = (*__memp); \ + while (atomic_compare_and_exchange_acq (__memp, \ + __oldval | __mask, __oldval)); \ \ - do \ - __oldval = *__memp; \ - while (atomic_compare_and_exchange_acq (__memp, \ - __oldval | __mask, \ - __oldval)); \ - }}) + __oldval & __mask; }) #endif |