Use __sync_add_and_fetch and __sync_sub_and_fetch when they are available
These functions may be available as inlines or as libgcc functions. In the former case, a __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macro is defined. But we still want to use these functions in the latter case, when we don't have our own implementation.
This commit is contained in:
parent
1e6138c88c
commit
c1e567bda0
34
configure.ac
34
configure.ac
@ -886,6 +886,40 @@ if test "x${je_cv_osatomic}" = "xyes" ; then
|
|||||||
AC_DEFINE([JEMALLOC_OSATOMIC], [ ])
|
AC_DEFINE([JEMALLOC_OSATOMIC], [ ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl ============================================================================
|
||||||
|
dnl Check whether __sync_{add,sub}_and_fetch() are available despite
|
||||||
|
dnl __GCC_HAVE_SYNC_COMPARE_AND_SWAP_n macros being undefined.
|
||||||
|
|
||||||
|
AC_DEFUN([JE_SYNC_COMPARE_AND_SWAP_CHECK],[
|
||||||
|
AC_CACHE_CHECK([whether to force $1-bit __sync_{add,sub}_and_fetch()],
|
||||||
|
[je_cv_sync_compare_and_swap_$2],
|
||||||
|
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
#include <stdint.h>
|
||||||
|
],
|
||||||
|
[
|
||||||
|
#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_$2
|
||||||
|
{
|
||||||
|
uint$1_t x$1 = 0;
|
||||||
|
__sync_add_and_fetch(&x$1, 42);
|
||||||
|
__sync_sub_and_fetch(&x$1, 1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error __GCC_HAVE_SYNC_COMPARE_AND_SWAP_$2 is defined, no need to force
|
||||||
|
#endif
|
||||||
|
])],
|
||||||
|
[je_cv_sync_compare_and_swap_$2=yes],
|
||||||
|
[je_cv_sync_compare_and_swap_$2=no])])
|
||||||
|
|
||||||
|
if test "x${je_cv_sync_compare_and_swap_$2}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JE_FORCE_SYNC_COMPARE_AND_SWAP_$2], [ ])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
if test "x${je_cv_osatomic}" != "xyes" ; then
|
||||||
|
JE_SYNC_COMPARE_AND_SWAP_CHECK(32, 4)
|
||||||
|
JE_SYNC_COMPARE_AND_SWAP_CHECK(64, 8)
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ============================================================================
|
dnl ============================================================================
|
||||||
dnl Check for spinlock(3) operations as provided on Darwin.
|
dnl Check for spinlock(3) operations as provided on Darwin.
|
||||||
|
|
||||||
|
@ -87,6 +87,20 @@ atomic_sub_uint64(uint64_t *p, uint64_t x)
|
|||||||
|
|
||||||
return (x);
|
return (x);
|
||||||
}
|
}
|
||||||
|
#elif (defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_8))
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (__sync_add_and_fetch(p, x));
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (__sync_sub_and_fetch(p, x));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
# if (LG_SIZEOF_PTR == 3)
|
# if (LG_SIZEOF_PTR == 3)
|
||||||
# error "Missing implementation for 64-bit atomic operations"
|
# error "Missing implementation for 64-bit atomic operations"
|
||||||
@ -150,9 +164,7 @@ atomic_sub_uint32(uint32_t *p, uint32_t x)
|
|||||||
|
|
||||||
return (x);
|
return (x);
|
||||||
}
|
}
|
||||||
#elif (defined __SH4__ || defined __mips__) && (__GNUC__ > 4 || \
|
#elif (defined(JE_FORCE_SYNC_COMPARE_AND_SWAP_4))
|
||||||
(__GNUC__ == 4 && (__GNUC_MINOR__ > 1 || (__GNUC_MINOR__ == 1 && \
|
|
||||||
__GNUC_PATCHLEVEL__ > 1))))
|
|
||||||
JEMALLOC_INLINE uint32_t
|
JEMALLOC_INLINE uint32_t
|
||||||
atomic_add_uint32(uint32_t *p, uint32_t x)
|
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||||
{
|
{
|
||||||
|
@ -53,6 +53,22 @@
|
|||||||
*/
|
*/
|
||||||
#undef JEMALLOC_OSATOMIC
|
#undef JEMALLOC_OSATOMIC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if __sync_add_and_fetch(uint32_t *, uint32_t) and
|
||||||
|
* __sync_sub_and_fetch(uint32_t *, uint32_t) are available, despite
|
||||||
|
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 not being defined (which means the
|
||||||
|
* functions are defined in libgcc instead of being inlines)
|
||||||
|
*/
|
||||||
|
#undef JE_FORCE_SYNC_COMPARE_AND_SWAP_4
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if __sync_add_and_fetch(uint64_t *, uint64_t) and
|
||||||
|
* __sync_sub_and_fetch(uint64_t *, uint64_t) are available, despite
|
||||||
|
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 not being defined (which means the
|
||||||
|
* functions are defined in libgcc instead of being inlines)
|
||||||
|
*/
|
||||||
|
#undef JE_FORCE_SYNC_COMPARE_AND_SWAP_8
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defined if OSSpin*() functions are available, as provided by Darwin, and
|
* Defined if OSSpin*() functions are available, as provided by Darwin, and
|
||||||
* documented in the spinlock(3) manual page.
|
* documented in the spinlock(3) manual page.
|
||||||
|
Loading…
Reference in New Issue
Block a user