From e60a7c39cdcdfd474c4f6cc3b4612870726f55dc Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 25 Oct 2007 10:24:01 +0100 Subject: [PATCH] [cairo-atomic] Check whether we can access int/pointers atomically. Add a configure check to determine whether the host cpu can read/write cairo_atomic_t without an explicit memory barrier, and update the macros within cairo-atomic-private.h to reflect this knowledge. --- configure.in | 15 +++++++++++++++ src/cairo-atomic-private.h | 20 +++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/configure.in b/configure.in index f85e33c02..7fbe4089f 100644 --- a/configure.in +++ b/configure.in @@ -103,6 +103,21 @@ AC_TRY_LINK([int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }], [] AC_MSG_RESULT([$cairo_atomic_primitives]) +AC_MSG_CHECKING([whether atomic ops require a memory barrier]) +case $host_cpu in + i?86) + cairo_atomic_op_needs_memory_barrier="no" + ;; + *) + cairo_atomic_op_needs_memory_barrier="yes" + ;; +esac +if test "x$cairo_atomic_op_needs_memory_barrier" = "xyes"; then + AC_DEFINE_UNQUOTED(CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER, 1, + [whether Cairo needs memory barriers around atomic ops]) +fi +AC_MSG_RESULT([$cairo_atomic_op_needs_memory_barrier]) + dnl =========================================================================== AC_CHECK_LIBM diff --git a/src/cairo-atomic-private.h b/src/cairo-atomic-private.h index fbf1d9aea..85fe95626 100644 --- a/src/cairo-atomic-private.h +++ b/src/cairo-atomic-private.h @@ -51,9 +51,6 @@ typedef int cairo_atomic_int_t; # define _cairo_atomic_int_inc(x) ((void) __sync_fetch_and_add(x, 1)) # define _cairo_atomic_int_dec_and_test(x) (__sync_fetch_and_add(x, -1) == 1) -# define _cairo_atomic_int_get(x) (*x) -# define _cairo_atomic_int_set(x, value) ((*x) = value) - # define _cairo_atomic_int_cmpxchg(x, oldv, newv) __sync_val_compare_and_swap (x, oldv, newv) #else @@ -70,17 +67,30 @@ _cairo_atomic_int_inc (int *x); cairo_private cairo_bool_t _cairo_atomic_int_dec_and_test (int *x); +cairo_private int +_cairo_atomic_int_cmpxchg (int *x, int oldv, int newv); + +#endif + + +#ifdef CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER + +# include "cairo-compiler-private.h" + cairo_private int _cairo_atomic_int_get (int *x); cairo_private void _cairo_atomic_int_set (int *x, int value); -cairo_private int -_cairo_atomic_int_cmpxchg (int *x, int oldv, int newv); +#else + +# define _cairo_atomic_int_get(x) (*x) +# define _cairo_atomic_int_set(x, value) ((*x) = value) #endif + #define _cairo_status_set_error(status, err) do { \ /* hide compiler warnings about cairo_status_t != int (gcc treats its as \ * an unsigned integer instead, and about ignoring the return value. */ \