[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