Add atomic operation support for OS X.
This commit is contained in:
parent
9a8fc41bb9
commit
763baa6cfc
@ -770,6 +770,28 @@ dnl modification.
|
|||||||
AC_CHECK_FUNC([ffsl], [],
|
AC_CHECK_FUNC([ffsl], [],
|
||||||
[AC_MSG_ERROR([Cannot build without ffsl(3)])])
|
[AC_MSG_ERROR([Cannot build without ffsl(3)])])
|
||||||
|
|
||||||
|
dnl ============================================================================
|
||||||
|
dnl Check for atomic(3) operations as provided on Darwin.
|
||||||
|
|
||||||
|
JE_COMPILABLE([Darwin OSAtomic*()], [
|
||||||
|
#include <libkern/OSAtomic.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
], [
|
||||||
|
{
|
||||||
|
int32_t x32 = 0;
|
||||||
|
volatile int32_t *x32p = &x32;
|
||||||
|
OSAtomicAdd32(1, x32p);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
int64_t x64 = 0;
|
||||||
|
volatile int64_t *x64p = &x64;
|
||||||
|
OSAtomicAdd64(1, x64p);
|
||||||
|
}
|
||||||
|
], [osatomic])
|
||||||
|
if test "x${osatomic}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_OSATOMIC])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ============================================================================
|
dnl ============================================================================
|
||||||
dnl Check for allocator-related functions that should be wrapped.
|
dnl Check for allocator-related functions that should be wrapped.
|
||||||
|
|
||||||
|
@ -49,6 +49,20 @@ atomic_sub_uint64(uint64_t *p, uint64_t x)
|
|||||||
|
|
||||||
return (__sync_sub_and_fetch(p, x));
|
return (__sync_sub_and_fetch(p, x));
|
||||||
}
|
}
|
||||||
|
#elif (defined(JEMALLOC_OSATOMIC))
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_add_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (OSAtomicAdd64((int64_t)x, (int64_t *)p));
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE uint64_t
|
||||||
|
atomic_sub_uint64(uint64_t *p, uint64_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (OSAtomicAdd64(-((int64_t)x), (int64_t *)p));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
# error "Missing implementation for 64-bit atomic operations"
|
# error "Missing implementation for 64-bit atomic operations"
|
||||||
#endif
|
#endif
|
||||||
@ -68,6 +82,20 @@ atomic_sub_uint32(uint32_t *p, uint32_t x)
|
|||||||
|
|
||||||
return (__sync_sub_and_fetch(p, x));
|
return (__sync_sub_and_fetch(p, x));
|
||||||
}
|
}
|
||||||
|
#elif (defined(JEMALLOC_OSATOMIC))
|
||||||
|
JEMALLOC_INLINE uint32_t
|
||||||
|
atomic_add_uint32(uint32_t *p, uint32_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (OSAtomicAdd32((int32_t)x, (int32_t *)p));
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_INLINE uint32_t
|
||||||
|
atomic_sub_uint32(uint32_t *p, uint32_t x)
|
||||||
|
{
|
||||||
|
|
||||||
|
return (OSAtomicAdd32(-((int32_t)x), (int32_t *)p));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
# error "Missing implementation for 32-bit atomic operations"
|
# error "Missing implementation for 32-bit atomic operations"
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,6 +33,10 @@
|
|||||||
#define JEMALLOC_MANGLE
|
#define JEMALLOC_MANGLE
|
||||||
#include "../jemalloc@install_suffix@.h"
|
#include "../jemalloc@install_suffix@.h"
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_OSATOMIC
|
||||||
|
#include <libkern/OSAtomic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef JEMALLOC_ZONE
|
#ifdef JEMALLOC_ZONE
|
||||||
#include <mach/mach_error.h>
|
#include <mach/mach_error.h>
|
||||||
#include <mach/mach_init.h>
|
#include <mach/mach_init.h>
|
||||||
|
@ -24,6 +24,12 @@
|
|||||||
*/
|
*/
|
||||||
#undef CPU_SPINWAIT
|
#undef CPU_SPINWAIT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if OSAtomic*() functions are available, as provided by Darwin, and
|
||||||
|
* documented in the atomic(3) manual page.
|
||||||
|
*/
|
||||||
|
#undef JEMALLOC_OSATOMIC
|
||||||
|
|
||||||
/* Defined if __attribute__((...)) syntax is supported. */
|
/* Defined if __attribute__((...)) syntax is supported. */
|
||||||
#undef JEMALLOC_HAVE_ATTR
|
#undef JEMALLOC_HAVE_ATTR
|
||||||
#ifdef JEMALLOC_HAVE_ATTR
|
#ifdef JEMALLOC_HAVE_ATTR
|
||||||
|
Loading…
Reference in New Issue
Block a user