Test for availability of malloc hooks via autoconf
__*_hook() is glibc, but on at least one glibc platform (homebrew), the __GLIBC__ define isn't set correctly and we miss being able to use these hooks. Do a feature test for it during configuration so that we enable it anywhere the hooks are actually available.
This commit is contained in:
parent
602c8e0971
commit
3e24afa28e
31
configure.ac
31
configure.ac
@ -1340,6 +1340,37 @@ if test "x${enable_zone_allocator}" = "x1" ; then
|
|||||||
AC_DEFINE_UNQUOTED(JEMALLOC_ZONE_VERSION, [$JEMALLOC_ZONE_VERSION])
|
AC_DEFINE_UNQUOTED(JEMALLOC_ZONE_VERSION, [$JEMALLOC_ZONE_VERSION])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl ============================================================================
|
||||||
|
dnl Check for glibc malloc hooks
|
||||||
|
|
||||||
|
JE_COMPILABLE([glibc malloc hook], [
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
extern void (* __free_hook)(void *ptr);
|
||||||
|
extern void *(* __malloc_hook)(size_t size);
|
||||||
|
extern void *(* __realloc_hook)(void *ptr, size_t size);
|
||||||
|
], [
|
||||||
|
void *ptr = 0L;
|
||||||
|
if (__malloc_hook) ptr = __malloc_hook(1);
|
||||||
|
if (__realloc_hook) ptr = __realloc_hook(ptr, 2);
|
||||||
|
if (__free_hook && ptr) __free_hook(ptr);
|
||||||
|
], [je_cv_glibc_malloc_hook])
|
||||||
|
if test "x${je_cv_glibc_malloc_hook}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_GLIBC_MALLOC_HOOK], [ ])
|
||||||
|
fi
|
||||||
|
|
||||||
|
JE_COMPILABLE([glibc memalign hook], [
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
extern void *(* __memalign_hook)(size_t alignment, size_t size);
|
||||||
|
], [
|
||||||
|
void *ptr = 0L;
|
||||||
|
if (__memalign_hook) ptr = __memalign_hook(16, 7);
|
||||||
|
], [je_cv_glibc_memalign_hook])
|
||||||
|
if test "x${je_cv_glibc_memalign_hook}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_GLIBC_MEMALIGN_HOOK], [ ])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl ============================================================================
|
dnl ============================================================================
|
||||||
dnl Check for typedefs, structures, and compiler characteristics.
|
dnl Check for typedefs, structures, and compiler characteristics.
|
||||||
AC_HEADER_STDBOOL
|
AC_HEADER_STDBOOL
|
||||||
|
@ -209,4 +209,10 @@
|
|||||||
/* sizeof(intmax_t) == 2^LG_SIZEOF_INTMAX_T. */
|
/* sizeof(intmax_t) == 2^LG_SIZEOF_INTMAX_T. */
|
||||||
#undef LG_SIZEOF_INTMAX_T
|
#undef LG_SIZEOF_INTMAX_T
|
||||||
|
|
||||||
|
/* glibc malloc hooks (__malloc_hook, __realloc_hook, __free_hook) */
|
||||||
|
#undef JEMALLOC_GLIBC_MALLOC_HOOK
|
||||||
|
|
||||||
|
/* glibc memalign hook */
|
||||||
|
#undef JEMALLOC_GLIBC_MEMALIGN_HOOK
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
||||||
|
@ -1336,7 +1336,7 @@ je_valloc(size_t size)
|
|||||||
#define is_malloc_(a) malloc_is_ ## a
|
#define is_malloc_(a) malloc_is_ ## a
|
||||||
#define is_malloc(a) is_malloc_(a)
|
#define is_malloc(a) is_malloc_(a)
|
||||||
|
|
||||||
#if ((is_malloc(je_malloc) == 1) && defined(__GLIBC__) && !defined(__UCLIBC__))
|
#if ((is_malloc(je_malloc) == 1) && defined(JEMALLOC_GLIBC_MALLOC_HOOK))
|
||||||
/*
|
/*
|
||||||
* glibc provides the RTLD_DEEPBIND flag for dlopen which can make it possible
|
* glibc provides the RTLD_DEEPBIND flag for dlopen which can make it possible
|
||||||
* to inconsistently reference libc's malloc(3)-compatible functions
|
* to inconsistently reference libc's malloc(3)-compatible functions
|
||||||
@ -1349,9 +1349,11 @@ je_valloc(size_t size)
|
|||||||
JEMALLOC_EXPORT void (*__free_hook)(void *ptr) = je_free;
|
JEMALLOC_EXPORT void (*__free_hook)(void *ptr) = je_free;
|
||||||
JEMALLOC_EXPORT void *(*__malloc_hook)(size_t size) = je_malloc;
|
JEMALLOC_EXPORT void *(*__malloc_hook)(size_t size) = je_malloc;
|
||||||
JEMALLOC_EXPORT void *(*__realloc_hook)(void *ptr, size_t size) = je_realloc;
|
JEMALLOC_EXPORT void *(*__realloc_hook)(void *ptr, size_t size) = je_realloc;
|
||||||
|
# ifdef JEMALLOC_GLIBC_MEMALIGN_HOOK
|
||||||
JEMALLOC_EXPORT void *(*__memalign_hook)(size_t alignment, size_t size) =
|
JEMALLOC_EXPORT void *(*__memalign_hook)(size_t alignment, size_t size) =
|
||||||
je_memalign;
|
je_memalign;
|
||||||
# endif
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End non-standard override functions.
|
* End non-standard override functions.
|
||||||
|
Loading…
Reference in New Issue
Block a user