From c17bf8b368dd400614a42942c2c31a50bce5c680 Mon Sep 17 00:00:00 2001 From: roblabla Date: Tue, 30 Jul 2024 14:56:42 +0200 Subject: [PATCH] Disable config from file or envvar with build flag This adds a new autoconf flag, --disable-user-config, which disables reading the configuration from /etc/malloc.conf or the MALLOC_CONF environment variable. This can be useful when integrating jemalloc in a binary that internally handles all aspects of the configuration and shouldn't be impacted by ambient change in the environment. --- configure.ac | 18 +++++++++++++ include/jemalloc/jemalloc_defs.h.in | 6 +++++ src/jemalloc.c | 40 ++++++++++++++++++----------- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac index 7f59b3f1..b01ff56b 100644 --- a/configure.ac +++ b/configure.ac @@ -1401,6 +1401,23 @@ if test "x$enable_stats" = "x1" ; then fi AC_SUBST([enable_stats]) +dnl Disable reading configuration from file and environment variable +AC_ARG_ENABLE([user_config], + [AS_HELP_STRING([--disable-user-config], + [Do not read malloc config from /etc/malloc.conf or MALLOC_CONF])], +[if test "x$enable_user_config" = "xno" ; then + enable_user_config="0" +else + enable_user_config="1" +fi +], +[enable_user_config="1"] +) +if test "x$enable_user_config" = "x1" ; then + AC_DEFINE([JEMALLOC_CONFIG_ENV], [ ], [ ]) + AC_DEFINE([JEMALLOC_CONFIG_FILE], [ ], [ ]) +fi + dnl Do not enable smallocx by default. AC_ARG_ENABLE([experimental_smallocx], [AS_HELP_STRING([--enable-experimental-smallocx], [Enable experimental smallocx API])], @@ -2962,6 +2979,7 @@ AC_MSG_RESULT([static libs : ${enable_static}]) AC_MSG_RESULT([autogen : ${enable_autogen}]) AC_MSG_RESULT([debug : ${enable_debug}]) AC_MSG_RESULT([stats : ${enable_stats}]) +AC_MSG_RESULT([user_config : ${enable_user_config}]) AC_MSG_RESULT([experimental_smallocx : ${enable_experimental_smallocx}]) AC_MSG_RESULT([prof : ${enable_prof}]) AC_MSG_RESULT([prof-libunwind : ${enable_prof_libunwind}]) diff --git a/include/jemalloc/jemalloc_defs.h.in b/include/jemalloc/jemalloc_defs.h.in index ef04e756..96c75011 100644 --- a/include/jemalloc/jemalloc_defs.h.in +++ b/include/jemalloc/jemalloc_defs.h.in @@ -46,6 +46,12 @@ */ #undef JEMALLOC_USE_CXX_THROW +/* + * If undefined, disables reading configuration from environment variable or file + */ +#undef JEMALLOC_CONFIG_ENV +#undef JEMALLOC_CONFIG_FILE + #ifdef _MSC_VER # ifdef _WIN64 # define LG_SIZEOF_PTR_WIN 3 diff --git a/src/jemalloc.c b/src/jemalloc.c index 6d2f6494..8ae72efb 100644 --- a/src/jemalloc.c +++ b/src/jemalloc.c @@ -985,44 +985,53 @@ obtain_malloc_conf(unsigned which_source, char readlink_buf[PATH_MAX + 1]) { } break; case 2: { +#ifndef JEMALLOC_CONFIG_FILE + ret = NULL; + break; +#else ssize_t linklen = 0; -#ifndef _WIN32 +# ifndef _WIN32 int saved_errno = errno; const char *linkname = -# ifdef JEMALLOC_PREFIX +# ifdef JEMALLOC_PREFIX "/etc/"JEMALLOC_PREFIX"malloc.conf" -# else +# else "/etc/malloc.conf" -# endif +# endif ; /* * Try to use the contents of the "/etc/malloc.conf" symbolic * link's name. */ -#ifndef JEMALLOC_READLINKAT +# ifndef JEMALLOC_READLINKAT linklen = readlink(linkname, readlink_buf, PATH_MAX); -#else +# else linklen = readlinkat(AT_FDCWD, linkname, readlink_buf, PATH_MAX); -#endif +# endif if (linklen == -1) { /* No configuration specified. */ linklen = 0; /* Restore errno. */ set_errno(saved_errno); } -#endif +# endif readlink_buf[linklen] = '\0'; ret = readlink_buf; break; - } case 3: { - const char *envname = -#ifdef JEMALLOC_PREFIX - JEMALLOC_CPREFIX"MALLOC_CONF" -#else - "MALLOC_CONF" #endif - ; + } case 3: { +#ifndef JEMALLOC_CONFIG_ENV + ret = NULL; + break; +#else + const char *envname = +# ifdef JEMALLOC_PREFIX + JEMALLOC_CPREFIX"MALLOC_CONF" +# else + "MALLOC_CONF" +# endif + ; if ((ret = jemalloc_getenv(envname)) != NULL) { opt_malloc_conf_env_var = ret; @@ -1031,6 +1040,7 @@ obtain_malloc_conf(unsigned which_source, char readlink_buf[PATH_MAX + 1]) { ret = NULL; } break; +#endif } case 4: { ret = je_malloc_conf_2_conf_harder; break;