diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-12 | 7 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 7 | ||||
-rw-r--r-- | configure.in | 6 | ||||
-rw-r--r-- | glib/gatomic.c | 44 |
6 files changed, 76 insertions, 2 deletions
@@ -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 |