mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-01-04 02:50:19 +01:00
[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:
parent
76667b4c2a
commit
e60a7c39cd
2 changed files with 30 additions and 5 deletions
15
configure.in
15
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
|
||||
|
|
|
|||
|
|
@ -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. */ \
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue