[PATCH] Allow to use different prefixes for jemalloc-specific functions and libc functions
Mike Hommey
mh+jemalloc at glandium.org
Thu Feb 23 03:25:11 PST 2012
I failed to add the following comment when sending the patch:
This supersedes the "Allow to include memalign and valloc even when
prefixing the API" patch.
On Thu, Feb 23, 2012 at 12:23:01PM +0100, Mike Hommey wrote:
> From: Mike Hommey <mh at glandium.org>
>
> In some cases, it can be interesting to use different prefixes for the
> "standard" libc malloc functions and for jemalloc specific functions. One such
> case is to use the "__wrap_" prefix on libc malloc functions (for use with ld's
> --wrap option) and no prefix or "je_" for jemalloc functions.
>
> In such cases, it can also me interesting not to exclude memalign and valloc,
> so this change also adds an option not to omit them when the prefix is set.
> ---
> configure.ac | 18 ++++++++++++++++++
> include/jemalloc/jemalloc.h.in | 15 +++++++++------
> include/jemalloc/jemalloc_defs.h.in | 10 ++++++++++
> src/jemalloc.c | 25 +++++++++++++------------
> 4 files changed, 50 insertions(+), 18 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 5ce16eb..704a703 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -320,6 +320,22 @@ if test "x$JEMALLOC_PREFIX" != "x" ; then
> AC_DEFINE_UNQUOTED([JEMALLOC_P(string_that_no_one_should_want_to_use_as_a_jemalloc_API_prefix)], [${JEMALLOC_PREFIX}##string_that_no_one_should_want_to_use_as_a_jemalloc_API_prefix])
> fi
>
> +AC_ARG_WITH([libc_prefix],
> + [AS_HELP_STRING([--with-libc-prefix=<prefix>], [Prefix to prepend to public APIs normally defined in libc. By default, same as --with-jemalloc-prefix])],
> + [JEMALLOC_LIBC_PREFIX="$with_libc_prefix"],
> + [JEMALLOC_LIBC_PREFIX="$JEMALLOC_PREFIX"])
> +
> +if test "x$JEMALLOC_LIBC_PREFIX" != "x" ; then
> + AC_DEFINE_UNQUOTED([JEMALLOC_LIBC_PREFIX], ["$JEMALLOC_LIBC_PREFIX"])
> + AC_DEFINE_UNQUOTED([JEMALLOC_LIBC(string_that_no_one_should_want_to_use_as_a_jemalloc_API_prefix)], [${JEMALLOC_LIBC_PREFIX}##string_that_no_one_should_want_to_use_as_a_jemalloc_API_prefix])
> +fi
> +
> +AC_ARG_ENABLE([libc_omit],
> + [AS_HELP_STRING([--disable-libc-omit], [Do not omit APIs that are normally ommitted when --with-jemalloc-prefix or --with-libc-prefix is used])])
> +if test "x$enable_libc_omit" = "xno" ; then
> + AC_DEFINE([JEMALLOC_LIBC_NO_OMIT])
> +fi
> +
> dnl Do not mangle library-private APIs by default.
> AC_ARG_WITH([private_namespace],
> [AS_HELP_STRING([--with-private-namespace=<prefix>], [Prefix to prepend to all library-private APIs])],
> @@ -915,6 +931,8 @@ AC_MSG_RESULT([objroot : ${objroot}])
> AC_MSG_RESULT([abs_objroot : ${abs_objroot}])
> AC_MSG_RESULT([])
> AC_MSG_RESULT([JEMALLOC_PREFIX : ${JEMALLOC_PREFIX}])
> +AC_MSG_RESULT([JEMALLOC_LIBC_PREFIX])
> +AC_MSG_RESULT([ : ${JEMALLOC_LIBC_PREFIX}])
> AC_MSG_RESULT([JEMALLOC_PRIVATE_NAMESPACE])
> AC_MSG_RESULT([ : ${JEMALLOC_PRIVATE_NAMESPACE}])
> AC_MSG_RESULT([install_suffix : ${install_suffix}])
> diff --git a/include/jemalloc/jemalloc.h.in b/include/jemalloc/jemalloc.h.in
> index e43a060..5e3d595 100644
> --- a/include/jemalloc/jemalloc.h.in
> +++ b/include/jemalloc/jemalloc.h.in
> @@ -15,6 +15,9 @@ extern "C" {
> #define JEMALLOC_VERSION_GID "@jemalloc_version_gid@"
>
> #include "jemalloc_defs at install_suffix@.h"
> +#ifndef JEMALLOC_LIBC
> +# define JEMALLOC_LIBC(s) s
> +#endif
> #ifndef JEMALLOC_P
> # define JEMALLOC_P(s) s
> #endif
> @@ -35,14 +38,14 @@ extern "C" {
> extern const char *JEMALLOC_P(malloc_conf);
> extern void (*JEMALLOC_P(malloc_message))(void *, const char *);
>
> -void *JEMALLOC_P(malloc)(size_t size) JEMALLOC_ATTR(malloc);
> -void *JEMALLOC_P(calloc)(size_t num, size_t size) JEMALLOC_ATTR(malloc);
> -int JEMALLOC_P(posix_memalign)(void **memptr, size_t alignment, size_t size)
> +void *JEMALLOC_LIBC(malloc)(size_t size) JEMALLOC_ATTR(malloc);
> +void *JEMALLOC_LIBC(calloc)(size_t num, size_t size) JEMALLOC_ATTR(malloc);
> +int JEMALLOC_LIBC(posix_memalign)(void **memptr, size_t alignment, size_t size)
> JEMALLOC_ATTR(nonnull(1));
> -void *JEMALLOC_P(realloc)(void *ptr, size_t size);
> -void JEMALLOC_P(free)(void *ptr);
> +void *JEMALLOC_LIBC(realloc)(void *ptr, size_t size);
> +void JEMALLOC_LIBC(free)(void *ptr);
>
> -size_t JEMALLOC_P(malloc_usable_size)(const void *ptr);
> +size_t JEMALLOC_LIBC(malloc_usable_size)(const void *ptr);
> size_t JEMALLOC_P(malloc_usable_size_in_advance)(size_t size,
> size_t alignment);
> void JEMALLOC_P(malloc_stats_print)(void (*write_cb)(void *, const char *),
> diff --git a/include/jemalloc/jemalloc_defs.h.in b/include/jemalloc/jemalloc_defs.h.in
> index d1622fb..18cad28 100644
> --- a/include/jemalloc/jemalloc_defs.h.in
> +++ b/include/jemalloc/jemalloc_defs.h.in
> @@ -17,6 +17,16 @@
> #if (defined(JEMALLOC_PREFIX) && defined(JEMALLOC_MANGLE))
> #undef JEMALLOC_P
> #endif
> +#undef JEMALLOC_LIBC_PREFIX
> +#if (defined(JEMALLOC_LIBC_PREFIX) && defined(JEMALLOC_MANGLE))
> +#undef JEMALLOC_LIBC
> +#endif
> +
> +/*
> + * If JEMALLOC_LIBC_NO_OMIT is defined, it will cause APIs that are normally
> + * ommitted when JEMALLOC_LIBC is defined, to be included.
> + */
> +#undef JEMALLOC_LIBC_NO_OMIT
>
> /*
> * JEMALLOC_PRIVATE_NAMESPACE is used as a prefix for all library-private APIs.
> diff --git a/src/jemalloc.c b/src/jemalloc.c
> index 64961c5..8b927f8 100644
> --- a/src/jemalloc.c
> +++ b/src/jemalloc.c
> @@ -856,7 +856,7 @@ jemalloc_darwin_init(void)
> JEMALLOC_ATTR(malloc)
> JEMALLOC_ATTR(visibility("default"))
> void *
> -JEMALLOC_P(malloc)(size_t size)
> +JEMALLOC_LIBC(malloc)(size_t size)
> {
> void *ret;
> size_t usize;
> @@ -1035,7 +1035,7 @@ RETURN:
> JEMALLOC_ATTR(nonnull(1))
> JEMALLOC_ATTR(visibility("default"))
> int
> -JEMALLOC_P(posix_memalign)(void **memptr, size_t alignment, size_t size)
> +JEMALLOC_LIBC(posix_memalign)(void **memptr, size_t alignment, size_t size)
> {
> /*
> * posix_memalign needs alignment to be a power of two and a multiple
> @@ -1051,7 +1051,7 @@ JEMALLOC_P(posix_memalign)(void **memptr, size_t alignment, size_t size)
> JEMALLOC_ATTR(malloc)
> JEMALLOC_ATTR(visibility("default"))
> void *
> -JEMALLOC_P(calloc)(size_t num, size_t size)
> +JEMALLOC_LIBC(calloc)(size_t num, size_t size)
> {
> void *ret;
> size_t num_size;
> @@ -1130,7 +1130,7 @@ RETURN:
>
> JEMALLOC_ATTR(visibility("default"))
> void *
> -JEMALLOC_P(realloc)(void *ptr, size_t size)
> +JEMALLOC_LIBC(realloc)(void *ptr, size_t size)
> {
> void *ret;
> size_t usize;
> @@ -1264,7 +1264,7 @@ RETURN:
>
> JEMALLOC_ATTR(visibility("default"))
> void
> -JEMALLOC_P(free)(void *ptr)
> +JEMALLOC_LIBC(free)(void *ptr)
> {
>
> if (ptr != NULL) {
> @@ -1292,16 +1292,17 @@ JEMALLOC_P(free)(void *ptr)
> /*
> * Begin non-standard override functions.
> *
> - * These overrides are omitted if the JEMALLOC_PREFIX is defined, since the
> - * entire point is to avoid accidental mixed allocator usage.
> + * These overrides are omitted if the JEMALLOC_LIBC_PREFIX is defined, since the
> + * entire point is to avoid accidental mixed allocator usage. They may however
> + * be included with the JEMALLOC_LIBC prefix if JEMALLOC_LIBC_NO_OMIT is defined.
> */
> -#ifndef JEMALLOC_PREFIX
> +#if !defined(JEMALLOC_LIBC_PREFIX) || defined(JEMALLOC_LIBC_NO_OMIT)
>
> #ifdef JEMALLOC_OVERRIDE_MEMALIGN
> JEMALLOC_ATTR(malloc)
> JEMALLOC_ATTR(visibility("default"))
> void *
> -JEMALLOC_P(memalign)(size_t alignment, size_t size)
> +JEMALLOC_LIBC(memalign)(size_t alignment, size_t size)
> {
> void *ret
> #ifdef JEMALLOC_CC_SILENCE
> @@ -1317,7 +1318,7 @@ JEMALLOC_P(memalign)(size_t alignment, size_t size)
> JEMALLOC_ATTR(malloc)
> JEMALLOC_ATTR(visibility("default"))
> void *
> -JEMALLOC_P(valloc)(size_t size)
> +JEMALLOC_LIBC(valloc)(size_t size)
> {
> void *ret
> #ifdef JEMALLOC_CC_SILENCE
> @@ -1340,7 +1341,7 @@ JEMALLOC_P(valloc)(size_t size)
>
> JEMALLOC_ATTR(visibility("default"))
> size_t
> -JEMALLOC_P(malloc_usable_size)(const void *ptr)
> +JEMALLOC_LIBC(malloc_usable_size)(const void *ptr)
> {
> size_t ret;
>
> @@ -1680,7 +1681,7 @@ jemalloc_postfork(void)
>
> /******************************************************************************/
>
> -#ifndef JEMALLOC_PREFIX
> +#ifndef JEMALLOC_LIBC_PREFIX
>
> #if defined(__GLIBC__) && !defined(__UCLIBC__)
> /*
> --
> 1.7.9.1
>
> _______________________________________________
> jemalloc-discuss mailing list
> jemalloc-discuss at canonware.com
> http://www.canonware.com/mailman/listinfo/jemalloc-discuss
More information about the jemalloc-discuss
mailing list