Add a C11 atomics-based implementation of atomic.h API.
This commit is contained in:
parent
a18c2b1f15
commit
59cd80e6c6
21
configure.ac
21
configure.ac
@ -1199,6 +1199,27 @@ elif test "x${force_tls}" = "x1" ; then
|
|||||||
AC_MSG_ERROR([Failed to configure TLS, which is mandatory for correct function])
|
AC_MSG_ERROR([Failed to configure TLS, which is mandatory for correct function])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl ============================================================================
|
||||||
|
dnl Check for C11 atomics.
|
||||||
|
|
||||||
|
JE_COMPILABLE([C11 atomics], [
|
||||||
|
#include <stdint.h>
|
||||||
|
#if (__STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_ATOMICS__)
|
||||||
|
#include <stdatomic.h>
|
||||||
|
#else
|
||||||
|
#error Atomics not available
|
||||||
|
#endif
|
||||||
|
], [
|
||||||
|
uint64_t *p = (uint64_t *)0;
|
||||||
|
uint64_t x = 1;
|
||||||
|
volatile atomic_uint_least64_t *a = (volatile atomic_uint_least64_t *)p;
|
||||||
|
uint64_t r = atomic_fetch_add(a, x) + x;
|
||||||
|
return (r == 0);
|
||||||
|
], [je_cv_c11atomics])
|
||||||
|
if test "x${je_cv_c11atomics}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_C11ATOMICS])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ============================================================================
|
dnl ============================================================================
|
||||||
dnl Check for atomic(9) operations as provided on FreeBSD.
|
dnl Check for atomic(9) operations as provided on FreeBSD.
|
||||||
|
|
||||||
|
@ -72,6 +72,20 @@ atomic_sub_uint64(uint64_t *p, uint64_t x)
|
|||||||
|
|
||||||
return (InterlockedExchangeAdd64(p, -((int64_t)x)) - x);
|
return (InterlockedExchangeAdd64(p, -((int64_t)x)) - x);
|
||||||
}
|
}
|
||||||
|
# elif (defined(JEMALLOC_C11ATOMICS))
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
volatile atomic_uint_least64_t *a = (volatile atomic_uint_least64_t *)p;
|
||||||
|
return (atomic_fetch_add(a, x) + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
volatile atomic_uint_least64_t *a = (volatile atomic_uint_least64_t *)p;
|
||||||
|
return (atomic_fetch_sub(a, x) - x);
|
||||||
|
}
|
||||||
# elif (defined(JEMALLOC_OSATOMIC))
|
# elif (defined(JEMALLOC_OSATOMIC))
|
||||||
JEMALLOC_INLINE uint64_t
|
JEMALLOC_INLINE uint64_t
|
||||||
atomic_add_uint64(uint64_t *p, uint64_t x)
|
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||||
@ -187,6 +201,20 @@ atomic_sub_uint32(uint32_t *p, uint32_t x)
|
|||||||
|
|
||||||
return (InterlockedExchangeAdd(p, -((int32_t)x)) - x);
|
return (InterlockedExchangeAdd(p, -((int32_t)x)) - x);
|
||||||
}
|
}
|
||||||
|
# elif (defined(JEMALLOC_C11ATOMICS))
|
||||||
|
JEMALLOC_INLINE uint32_t
|
||||||
|
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||||
|
{
|
||||||
|
volatile atomic_uint_least32_t *a = (volatile atomic_uint_least32_t *)p;
|
||||||
|
return (atomic_fetch_add(a, x) + x);
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE uint32_t
|
||||||
|
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||||
|
{
|
||||||
|
volatile atomic_uint_least32_t *a = (volatile atomic_uint_least32_t *)p;
|
||||||
|
return (atomic_fetch_sub(a, x) - x);
|
||||||
|
}
|
||||||
#elif (defined(JEMALLOC_OSATOMIC))
|
#elif (defined(JEMALLOC_OSATOMIC))
|
||||||
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)
|
||||||
|
@ -127,6 +127,10 @@ static const bool config_ivsalloc =
|
|||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_C11ATOMICS
|
||||||
|
#include <stdatomic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef JEMALLOC_ATOMIC9
|
#ifdef JEMALLOC_ATOMIC9
|
||||||
#include <machine/atomic.h>
|
#include <machine/atomic.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -22,6 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
#undef CPU_SPINWAIT
|
#undef CPU_SPINWAIT
|
||||||
|
|
||||||
|
/* Defined if C11 atomics are available. */
|
||||||
|
#undef JEMALLOC_C11ATOMICS
|
||||||
|
|
||||||
/* Defined if the equivalent of FreeBSD's atomic(9) functions are available. */
|
/* Defined if the equivalent of FreeBSD's atomic(9) functions are available. */
|
||||||
#undef JEMALLOC_ATOMIC9
|
#undef JEMALLOC_ATOMIC9
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user