summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ChangeLog.pre-2-107
-rw-r--r--ChangeLog.pre-2-127
-rw-r--r--ChangeLog.pre-2-87
-rw-r--r--configure.in6
-rw-r--r--glib/gatomic.c44
6 files changed, 76 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index cffcdeab3..4638d549a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Add native atomic operations
+ for s390.
+
+ * configure.in: ... and use them on s390.
+
2005-08-03 Ross Burton <ross@burtonini.com>
* glib/gstdio.c:
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index cffcdeab3..4638d549a 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,10 @@
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Add native atomic operations
+ for s390.
+
+ * configure.in: ... and use them on s390.
+
2005-08-03 Ross Burton <ross@burtonini.com>
* glib/gstdio.c:
diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12
index cffcdeab3..4638d549a 100644
--- a/ChangeLog.pre-2-12
+++ b/ChangeLog.pre-2-12
@@ -1,3 +1,10 @@
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Add native atomic operations
+ for s390.
+
+ * configure.in: ... and use them on s390.
+
2005-08-03 Ross Burton <ross@burtonini.com>
* glib/gstdio.c:
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index cffcdeab3..4638d549a 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,10 @@
+2005-08-03 Matthias Clasen <mclasen@redhat.com>
+
+ * glib/gatomic.c: Add native atomic operations
+ for s390.
+
+ * configure.in: ... and use them on s390.
+
2005-08-03 Ross Burton <ross@burtonini.com>
* glib/gstdio.c:
diff --git a/configure.in b/configure.in
index 0607164e8..562707a2b 100644
--- a/configure.in
+++ b/configure.in
@@ -1967,6 +1967,12 @@ if test x"$GCC" = xyes; then
[ia64 atomic implementation])
glib_memory_barrier_needed=yes
;;
+ s390|s390x)
+ AC_MSG_RESULT([s390])
+ AC_DEFINE_UNQUOTED(G_ATOMIC_S390, 1,
+ [s390 atomic implementation])
+ glib_memory_barrier_needed=no
+ ;;
*)
AC_MSG_RESULT([none])
glib_memory_barrier_needed=yes
diff --git a/glib/gatomic.c b/glib/gatomic.c
index 2f4f9b00f..ad1f163bc 100644
--- a/glib/gatomic.c
+++ b/glib/gatomic.c
@@ -442,9 +442,49 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
}
# define G_ATOMIC_MEMORY_BARRIER __sync_synchronize ()
-# else /* !G_ATOMIC */
+# elif defined (G_ATOMIC_S390)
+/* Adapted from glibc's sysdeps/s390/bits/atomic.h
+ */
+# define ATOMIC_INT_CMP_XCHG(atomic, oldval, newval) \
+ ({ \
+ gint __result = oldval; \
+ __asm__ __volatile__ ("cs %0, %2, %1" \
+ : "+d" (__result), "=Q" (*(atomic)) \
+ : "d" (newval), "m" (*(atomic)) : "cc" ); \
+ __result == oldval; \
+ })
+
+# if GLIB_SIZEOF_VOID_P == 4 /* 32-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result = oldval;
+ __asm__ __volatile__ ("cs %0, %2, %1"
+ : "+d" (result), "=Q" (*(atomic))
+ : "d" (newval), "m" (*(atomic)) : "cc" );
+ result == oldval;
+}
+# elif GLIB_SIZEOF_VOID_P == 8 /* 64-bit system */
+gboolean
+g_atomic_pointer_compare_and_exchange (gpointer *atomic,
+ gpointer oldval,
+ gpointer newval)
+{
+ gpointer result = oldval;
+ gpointer *a = atomic;
+ __asm__ __volatile__ ("csg %0, %2, %1"
+ : "+d" (result), "=Q" (*a)
+ : "d" ((long)(newval)), "m" (*a) : "cc" );
+ result == oldval;
+}
+# else /* What's that */
+# error "Your system has an unsupported pointer size"
+# endif /* GLIB_SIZEOF_VOID_P */
+# else /* !G_ATOMIC_IA64 */
# define DEFINE_WITH_MUTEXES
-# endif /* G_ATOMIC */
+# endif /* G_ATOMIC_IA64 */
#else /* !__GNUC__ */
# ifdef G_PLATFORM_WIN32
# define DEFINE_WITH_WIN32_INTERLOCKED