Bug 1805 - Use GCC supported intrinsics for interlocking. CompilerCompatibility
authorPeter Fordham <peter.fordham@gmail.com>
Mon, 22 Mar 2010 12:55:48 -0700
branchCompilerCompatibility
changeset 12 8f46d5fb6bec
parent 11 8d1ef0d13f16
child 13 ef48f5dc1b7f
Bug 1805 - Use GCC supported intrinsics for interlocking.
glib/libglib/src/gatomic.c
--- a/glib/libglib/src/gatomic.c	Mon Mar 22 12:54:15 2010 -0700
+++ b/glib/libglib/src/gatomic.c	Mon Mar 22 12:55:48 2010 -0700
@@ -38,7 +38,44 @@
 
 
 #if defined (__GNUC__)
-# if defined (G_ATOMIC_I486)
+#define GCC_VERSION (__GNUC__ * 10000 \
+                               + __GNUC_MINOR__ * 100 \
+                               + __GNUC_PATCHLEVEL__)
+
+/* Test for GCC > 4.4.0 */
+# if (GCC_VERSION > 40400)
+
+EXPORT_C gint
+g_atomic_int_exchange_and_add (volatile gint *atomic,
+			       gint           val)
+{
+   return __sync_fetch_and_add(atomic, val);
+}
+
+EXPORT_C void
+g_atomic_int_add (volatile gint *atomic,
+		  gint           val)
+{
+   __sync_fetch_and_add(atomic, val);
+}
+
+EXPORT_C gboolean
+g_atomic_int_compare_and_exchange (volatile gint *atomic,
+				   gint           oldval,
+				   gint           newval)
+{
+  return __sync_val_compare_and_swap(atomic, oldval, newval);
+}
+
+EXPORT_C gboolean
+g_atomic_pointer_compare_and_exchange (volatile gpointer *atomic,
+				       gpointer           oldval,
+				       gpointer           newval)
+{
+  return __sync_val_compare_and_swap(atomic, oldval, newval);
+}
+
+#elif defined (G_ATOMIC_I486)
 /* Adapted from CVS version 1.10 of glibc's sysdeps/i386/i486/bits/atomic.h 
  */
 EXPORT_C gint