]> granicus.if.org Git - libatomic_ops/commitdiff
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>
Thu, 3 Jan 2013 08:25:33 +0000 (09:25 +0100)
* 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 3b23fa0ba5df69841ca36f2f1c28318f2a8554c3..de94843b3dcc68a8fad5f32a19b52ba4ae35c847 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 0e504fa6bbf0f03c25da69049ddc04f24279cce7..b9c05db0a7d4078ace4b419c7ce1450f99146a1c 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) \