aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <pcarlini@suse.de>2006-05-29 20:00:29 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2006-05-29 20:00:29 +0000
commit9268b7cb5f1d111b638ca275007415ec580aebf5 (patch)
treef42102a03cc9d8999b5f5f2e7b0f5aacc5ceff7f
parentacb69f1c028c9967eab7675135171531727072c2 (diff)
downloadgcc-9268b7cb5f1d111b638ca275007415ec580aebf5.zip
gcc-9268b7cb5f1d111b638ca275007415ec580aebf5.tar.gz
gcc-9268b7cb5f1d111b638ca275007415ec580aebf5.tar.bz2
re PR libstdc++/24692 (Atomic builtins for v3)
2006-05-29 Paolo Carlini <pcarlini@suse.de> PR libstdc++/24692 * include/bits/atomicity.h (__exchange_and_add_multi, __atomic_add_multi): New, depending on _GLIBCXX_ATOMIC_BUILTINS, inline the atomic builtins. (__exchange_and_add_dispatch, __atomic_add_dispatch): Adjust. * configure.ac: Define _GLIBCXX_ATOMIC_BUILTINS when the atomic builtins are available. * configure: Regenerate. * config.h.in: Likewise. From-SVN: r114215
-rw-r--r--libstdc++-v3/ChangeLog12
-rw-r--r--libstdc++-v3/config.h.in3
-rwxr-xr-xlibstdc++-v3/configure9
-rw-r--r--libstdc++-v3/configure.ac6
-rw-r--r--libstdc++-v3/include/bits/atomicity.h32
5 files changed, 60 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index aea6f28..791b42f 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,15 @@
+2006-05-29 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/24692
+ * include/bits/atomicity.h (__exchange_and_add_multi,
+ __atomic_add_multi): New, depending on _GLIBCXX_ATOMIC_BUILTINS,
+ inline the atomic builtins.
+ (__exchange_and_add_dispatch, __atomic_add_dispatch): Adjust.
+ * configure.ac: Define _GLIBCXX_ATOMIC_BUILTINS when the atomic
+ builtins are available.
+ * configure: Regenerate.
+ * config.h.in: Likewise.
+
2006-05-27 Paolo Carlini <pcarlini@suse.de>
* configure.host: If the CPU provides atomic builtins select
diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in
index 5c373f5..a75af38 100644
--- a/libstdc++-v3/config.h.in
+++ b/libstdc++-v3/config.h.in
@@ -655,6 +655,9 @@
/* Version number of package */
#undef VERSION
+/* Define if atomic builtins are provided for this platform. */
+#undef _GLIBCXX_ATOMIC_BUILTINS
+
/* Define to use concept checking code from the boost libraries. */
#undef _GLIBCXX_CONCEPT_CHECKS
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 72dceb4..68e2f6c 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -109856,6 +109856,15 @@ ABI_TWEAKS_SRCDIR=config/${abi_tweaks_dir}
+# Atomic builtins can be inlined in bits/atomicity.h.
+if test $atomicity_dir = cpu/generic/atomic_builtins ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_ATOMIC_BUILTINS 1
+_ACEOF
+
+fi
+
# Determine cross-compile flags and AM_CONDITIONALs.
#AC_SUBST(GLIBCXX_IS_NATIVE)
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index d6a7b98..45dd410 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -318,6 +318,12 @@ AC_SUBST(CPU_DEFINES_SRCDIR)
AC_SUBST(ABI_TWEAKS_SRCDIR)
AC_SUBST(OS_INC_SRCDIR)
+# Atomic builtins can be inlined in bits/atomicity.h.
+if test $atomicity_dir = cpu/generic/atomic_builtins ; then
+ AC_DEFINE([_GLIBCXX_ATOMIC_BUILTINS], 1,
+ [Define if atomic builtins are provided for this platform.])
+fi
+
# Determine cross-compile flags and AM_CONDITIONALs.
#AC_SUBST(GLIBCXX_IS_NATIVE)
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
diff --git a/libstdc++-v3/include/bits/atomicity.h b/libstdc++-v3/include/bits/atomicity.h
index 53ab6fa..c6a9883 100644
--- a/libstdc++-v3/include/bits/atomicity.h
+++ b/libstdc++-v3/include/bits/atomicity.h
@@ -50,6 +50,34 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
__atomic_add(volatile _Atomic_word* __mem, int __val);
static inline _Atomic_word
+ __exchange_and_add_multi(volatile _Atomic_word* __mem, int __val)
+ {
+#ifdef _GLIBCXX_ATOMIC_BUILTINS
+
+ return __sync_fetch_and_add(__mem, __val);
+
+#else
+
+ return __exchange_and_add(__mem, __val);
+
+#endif
+ }
+
+ static inline void
+ __atomic_add_multi(volatile _Atomic_word* __mem, int __val)
+ {
+#ifdef _GLIBCXX_ATOMIC_BUILTINS
+
+ __sync_fetch_and_add(__mem, __val);
+
+#else
+
+ __atomic_add(__mem, __val);
+
+#endif
+ }
+
+ static inline _Atomic_word
__exchange_and_add_single(volatile _Atomic_word* __mem, int __val)
{
_Atomic_word __result = *__mem;
@@ -68,7 +96,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
#ifdef __GTHREADS
if (__gthread_active_p())
- return __exchange_and_add(__mem, __val);
+ return __exchange_and_add_multi(__mem, __val);
else
return __exchange_and_add_single(__mem, __val);
@@ -86,7 +114,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
#ifdef __GTHREADS
if (__gthread_active_p())
- __atomic_add(__mem, __val);
+ __atomic_add_multi(__mem, __val);
else
__atomic_add_single(__mem, __val);