From 5878c26857f1e4dab19b16903b9e3e1b897c06e2 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Wed, 2 Jan 2013 13:10:34 +0400 Subject: [PATCH] Fix generalize-small template adding missed CAS-based fetch_and_add * 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 | 51 ++++++++++++++++++++++++ src/atomic_ops/generalize-small.template | 17 ++++++++ 2 files changed, 68 insertions(+) diff --git a/src/atomic_ops/generalize-small.h b/src/atomic_ops/generalize-small.h index 076b4cb..7e27db6 100644 --- a/src/atomic_ops/generalize-small.h +++ b/src/atomic_ops/generalize-small.h @@ -249,6 +249,23 @@ # 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) \ @@ -875,6 +892,23 @@ # 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) \ @@ -1501,6 +1535,23 @@ # 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) \ diff --git a/src/atomic_ops/generalize-small.template b/src/atomic_ops/generalize-small.template index 4cefce4..19fddd6 100644 --- a/src/atomic_ops/generalize-small.template +++ b/src/atomic_ops/generalize-small.template @@ -249,6 +249,23 @@ # 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) \ -- 2.40.0