Fix generalize-small template adding missed CAS-based fetch_and_add
authorIvan Maidanski <ivmai@mail.ru>
Wed, 2 Jan 2013 09:10:34 +0000 (13:10 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Wed, 2 Jan 2013 09:10:34 +0000 (13:10 +0400)
* src/atomic_ops/generalize-small.template (AO_XSIZE_fetch_and_add):
Add missed definition based on CAS.
* src/atomic_ops/generalize-small.h: Regenerate.

src/atomic_ops/generalize-small.h
src/atomic_ops/generalize-small.template

index 076b4cb..7e27db6 100644 (file)
 # define AO_HAVE_char_fetch_and_add_release
 #endif
 
+#if defined(AO_HAVE_char_compare_and_swap) \
+    && !defined(AO_HAVE_char_fetch_and_add)
+  AO_INLINE unsigned char
+  AO_char_fetch_and_add(volatile unsigned char *addr, unsigned char incr)
+  {
+    unsigned char old;
+    do
+      {
+        old = *addr;
+      }
+    while (AO_EXPECT_FALSE(!AO_char_compare_and_swap(addr, old,
+                                                      old + incr)));
+    return old;
+  }
+# define AO_HAVE_char_fetch_and_add
+#endif
+
 #if defined(AO_HAVE_char_fetch_and_add_full)
 # if !defined(AO_HAVE_char_fetch_and_add_release)
 #   define AO_char_fetch_and_add_release(addr, val) \
 # define AO_HAVE_short_fetch_and_add_release
 #endif
 
+#if defined(AO_HAVE_short_compare_and_swap) \
+    && !defined(AO_HAVE_short_fetch_and_add)
+  AO_INLINE unsigned short
+  AO_short_fetch_and_add(volatile unsigned short *addr, unsigned short incr)
+  {
+    unsigned short old;
+    do
+      {
+        old = *addr;
+      }
+    while (AO_EXPECT_FALSE(!AO_short_compare_and_swap(addr, old,
+                                                      old + incr)));
+    return old;
+  }
+# define AO_HAVE_short_fetch_and_add
+#endif
+
 #if defined(AO_HAVE_short_fetch_and_add_full)
 # if !defined(AO_HAVE_short_fetch_and_add_release)
 #   define AO_short_fetch_and_add_release(addr, val) \
 # define AO_HAVE_int_fetch_and_add_release
 #endif
 
+#if defined(AO_HAVE_int_compare_and_swap) \
+    && !defined(AO_HAVE_int_fetch_and_add)
+  AO_INLINE unsigned int
+  AO_int_fetch_and_add(volatile unsigned int *addr, unsigned int incr)
+  {
+    unsigned int old;
+    do
+      {
+        old = *addr;
+      }
+    while (AO_EXPECT_FALSE(!AO_int_compare_and_swap(addr, old,
+                                                      old + incr)));
+    return old;
+  }
+# define AO_HAVE_int_fetch_and_add
+#endif
+
 #if defined(AO_HAVE_int_fetch_and_add_full)
 # if !defined(AO_HAVE_int_fetch_and_add_release)
 #   define AO_int_fetch_and_add_release(addr, val) \
index 4cefce4..19fddd6 100644 (file)
 # define AO_HAVE_XSIZE_fetch_and_add_release
 #endif
 
+#if defined(AO_HAVE_XSIZE_compare_and_swap) \
+    && !defined(AO_HAVE_XSIZE_fetch_and_add)
+  AO_INLINE unsigned XCTYPE
+  AO_XSIZE_fetch_and_add(volatile unsigned XCTYPE *addr, unsigned XCTYPE incr)
+  {
+    unsigned XCTYPE old;
+    do
+      {
+        old = *addr;
+      }
+    while (AO_EXPECT_FALSE(!AO_XSIZE_compare_and_swap(addr, old,
+                                                      old + incr)));
+    return old;
+  }
+# define AO_HAVE_XSIZE_fetch_and_add
+#endif
+
 #if defined(AO_HAVE_XSIZE_fetch_and_add_full)
 # if !defined(AO_HAVE_XSIZE_fetch_and_add_release)
 #   define AO_XSIZE_fetch_and_add_release(addr, val) \