[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.
This commit is contained in:
Chris Wilson 2007-10-25 10:24:01 +01:00
parent 76667b4c2a
commit e60a7c39cd
2 changed files with 30 additions and 5 deletions

View file

@ -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

View file

@ -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. */ \