Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 5 Feb 2003 07:22:09 +0000 (07:22 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 5 Feb 2003 07:22:09 +0000 (07:22 +0000)
* atomic.h: Add a couple more default implementations.
(atomic_compare_and_exchange_acq): Use

nptl/ChangeLog
nptl/atomic.h

index f018ccc..215ec8d 100644 (file)
@@ -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.
index c8ea95f..85a43c0 100644 (file)
@@ -60,7 +60,7 @@
      while (atomic_compare_and_exchange_acq (__memp, __oldval + __value,      \
                                             __oldval));                      \
                                                                              \
-     __value; })
+     __oldval; })
 #endif
 
 
 #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