atomic ops broken on mac/xcode
- From: Justin Karneges <justin affinix com>
- To: gtk-devel-list gnome org
- Subject: atomic ops broken on mac/xcode
- Date: Fri, 24 Aug 2012 18:51:43 -0700
Hi,
It seems that the atomic operation detection does not work for gcc 4.2.1,
which is the latest version shipped with Xcode. Since the Mac is an important
platform to support, I hope a workaround can be made for this unfortunately
very old gcc version.
I do not know the best way to fix this. What I have noticed is that this
version of gcc does seem to understand the __sync_synchronized() instruction,
and so if I force the code to compile anyway, regardless of the available
compiler flags (read: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4), then the code builds
and appears to work. At least I can run a complex GStreamer-based app without
any apparent bugs. This does not prove synchronization is actually happening
but I hope it is...
Attached is a patch that somewhat forces things to work on Mac. It likely
breaks other platforms though. Maybe someone else knows enough about this stuff
to rework it in a way that it could be safe for everyone and be committed to
glib.
Justin
diff -ru glib-2.32.0.orig/config.h.in glib-2.32.0/config.h.in
--- glib-2.32.0.orig/config.h.in 2012-03-23 20:02:41.000000000 -0700
+++ glib-2.32.0/config.h.in 2012-08-24 18:16:10.000000000 -0700
@@ -168,6 +168,9 @@
/* Define to 1 if you have the `fsync' function. */
#undef HAVE_FSYNC
+/* we have __sync_synchronize in gcc */
+#undef HAVE_GCC_SYNC_SYNCHRONIZE
+
/* we have the futex(2) system call */
#undef HAVE_FUTEX
diff -ru glib-2.32.0.orig/configure glib-2.32.0/configure
--- glib-2.32.0.orig/configure 2012-03-23 20:02:40.000000000 -0700
+++ glib-2.32.0/configure 2012-08-24 18:15:08.000000000 -0700
@@ -26787,7 +26787,8 @@
int
main ()
{
-__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;
+ __sync_synchronize();
+//__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;
;
return 0;
}
@@ -26811,7 +26812,8 @@
int
main ()
{
-__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;
+ __sync_synchronize();
+//__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4;
;
return 0;
}
@@ -26823,6 +26825,12 @@
CFLAGS="${SAVE_CFLAGS}"
fi
+if test x"$glib_cv_g_atomic_lock_free" = xyes; then
+
+$as_echo "#define HAVE_GCC_SYNC_SYNCHRONIZE 1" >>confdefs.h
+
+fi
+
case $host_cpu in
i?86|x86_64|s390|s390x|arm*|crisv32*|etrax*)
glib_memory_barrier_needed=no
diff -ru glib-2.32.0.orig/glib/gatomic.c glib-2.32.0/glib/gatomic.c
--- glib-2.32.0.orig/glib/gatomic.c 2012-03-11 17:42:41.000000000 -0700
+++ glib-2.32.0/glib/gatomic.c 2012-08-24 18:21:00.000000000 -0700
@@ -96,7 +96,7 @@
* implement the atomic operations in a lock-free manner.
*/
-#if defined (__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+#if defined (HAVE_GCC_SYNC_SYNCHRONIZE)
/**
* g_atomic_int_get:
* @atomic: a pointer to a #gint or #guint
diff -ru glib-2.32.0.orig/glib/gatomic.h glib-2.32.0/glib/gatomic.h
--- glib-2.32.0.orig/glib/gatomic.h 2012-03-11 17:42:41.000000000 -0700
+++ glib-2.32.0/glib/gatomic.h 2012-08-24 18:20:44.000000000 -0700
@@ -68,7 +68,7 @@
G_END_DECLS
-#if defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)
+#if defined(G_ATOMIC_LOCK_FREE) && defined(HAVE_GCC_SYNC_SYNCHRONIZE)
#define g_atomic_int_get(atomic) \
(G_GNUC_EXTENSION ({ \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]