AM_CONDITIONAL([HAVE_CMOCKA], [test "$with_cmocka" = "yes"])
#
+# Compile with jemalloc (either provided as package or wired in the system on FreeBSD and NetBSD)
#
-#
-AC_MSG_CHECKING([for jemalloc])
-PKG_CHECK_MODULES([JEMALLOC], [jemalloc >= 5], []
- [AC_MSG_WARN([Using jemalloc 5 is recommended])
- PKG_CHECK_MODULES([JEMALLOC], [jemalloc], [],
- [AC_MSG_ERROR([jemalloc not found])])])
-AC_SUBST([JEMALLOC_CFLAGS])
-AC_SUBST([JEMALLOC_LIBS])
+# [pairwise: --with-jemalloc=detect, --with-jemalloc=yes, --without-jemalloc]
+AC_ARG_WITH([jemalloc],
+ [AS_HELP_STRING([--with-jemalloc=detect],[enable jemalloc memory allocator (default is detect)])],
+ [],[with_jemalloc=detect])
+
+AS_CASE([$with_jemalloc],
+ [no],[],
+ [yes],[AX_CHECK_JEMALLOC(
+ [AC_DEFINE([HAVE_JEMALLOC], [1], [Define to 1 if jemalloc is available])],
+ [AC_MSG_ERROR([jemalloc not found])])],
+ [AX_CHECK_JEMALLOC(
+ [AC_DEFINE([HAVE_JEMALLOC], [1], [Define to 1 if jemalloc is available])
+ with_jemalloc=yes],
+ [AC_MSG_WARN([jemalloc not found; performance will be reduced])
+ with_jemalloc=no])])
+
+AS_IF([test "$with_jemalloc" = "no"],
+ [AC_CHECK_FUNCS([malloc_size malloc_usable_size])])
#
# was --with-tuning specified?
echo "Configuration summary:"
echo "-------------------------------------------------------------------------------"
echo "Optional features enabled:"
+ if test "yes" = "$with_jemalloc"; then
+ echo " Memory allocator: jemalloc"
+ fi
if test "yes" = "$enable_full_report" -o "standard" = "$with_locktype"; then
echo " Mutex lock type: $with_locktype"
fi
echo "-------------------------------------------------------------------------------"
echo "Features disabled or unavailable on this platform:"
+ if test "no" = "$with_jemalloc"; then
+ echo " Memory allocator: system"
+ echo " WARNING: This is not a recommended configuration"
+ echo " WARNING: Using system memory allocator causes"
+ echo " WARNING: reduced performance and increased memory"
+ echo " WARNING: fragmentation. Installing jemalloc >= 4.0.0"
+ echo " WARNING: memory allocator is strongly recommended."
+ fi
test "small" = "$with_tuning" || echo " Small-system tuning (--with-tuning)"
test "no" = "$enable_dnstap" && \
httpd.c \
interfaceiter.c \
iterated_hash.c \
+ jemalloc_shim.h \
lex.c \
lib.c \
log.c \
--- /dev/null
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, you can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+
+#pragma once
+
+#if !defined(HAVE_JEMALLOC)
+
+#include <isc/util.h>
+
+const char *malloc_conf = NULL;
+
+#if defined(HAVE_MALLOC_SIZE) || defined(HAVE_MALLOC_USABLE_SIZE)
+
+#include <stdlib.h>
+
+static inline void *
+mallocx(size_t size, int flags) {
+ UNUSED(flags);
+ void *__ptr = malloc(size);
+ REQUIRE(__ptr != NULL);
+ return (__ptr);
+}
+
+static inline void
+sdallocx(void *ptr, size_t size, int flags) {
+ UNUSED(size);
+ UNUSED(flags);
+
+ free(ptr);
+}
+
+static inline void *
+rallocx(void *ptr, size_t size, int flags) {
+ UNUSED(flags);
+ REQUIRE(size != 0);
+
+ void *__ptr = realloc(ptr, size);
+ REQUIRE(__ptr != NULL);
+
+ return (__ptr);
+}
+
+#ifdef HAVE_MALLOC_SIZE
+
+#include <malloc/malloc.h>
+
+static inline size_t
+sallocx(void *ptr, int flags) {
+ UNUSED(flags);
+
+ return (malloc_size(ptr));
+}
+
+#elif HAVE_MALLOC_USABLE_SIZE
+
+#include <malloc.h>
+
+static inline size_t
+sallocx(void *ptr, int flags) {
+ UNUSED(flags);
+
+ return (malloc_usable_size(ptr));
+}
+
+#endif /* HAVE_MALLOC_SIZE */
+
+#else /* defined(HAVE_MALLOC_SIZE) || defined (HAVE_MALLOC_USABLE_SIZE) */
+
+#include <stdlib.h>
+
+static inline void *
+mallocx(size_t size, int flags) {
+ UNUSED(flags);
+
+ size_t *__ptr = malloc(size + sizeof(size_t));
+ REQUIRE(__ptr != NULL);
+ __ptr[0] = size;
+
+ return (&__ptr[1]);
+}
+
+static inline void
+sdallocx(void *ptr, size_t size, int flags) {
+ UNUSED(size);
+ UNUSED(flags);
+
+ free(&((size_t *)ptr)[-1]);
+}
+
+static inline size_t
+sallocx(void *ptr, int flags) {
+ UNUSED(flags);
+
+ return (((size_t *)ptr)[-1]);
+}
+
+static inline void *
+rallocx(void *ptr, size_t size, int flags) {
+ UNUSED(flags);
+
+ size_t *__ptr = realloc(&((size_t *)ptr)[-1], size);
+ REQUIRE(__ptr != NULL);
+ __ptr[0] = size;
+
+ return (&__ptr[1]);
+}
+
+#endif /* defined(HAVE_MALLOC_SIZE) || defined (HAVE_MALLOC_USABLE_SIZE) */
+
+#endif /* !defined(HAVE_JEMALLOC) */
#include <json_object.h>
#endif /* HAVE_JSON_C */
+#if defined(HAVE_MALLOC_NP_H)
+#include <malloc_np.h>
+#elif defined(HAVE_JEMALLOC)
#include <jemalloc/jemalloc.h>
+#if JEMALLOC_VERSION_MAJOR < 4
+#define sdallocx(ptr, size, flags) dallocx(ptr, flags)
+#endif /* JEMALLOC_VERSION_MAJOR < 4 */
+
+#else
+#include "jemalloc_shim.h"
+#endif
+
#include "mem_p.h"
#define MCTXLOCK(m) LOCK(&m->lock)
--- /dev/null
+# ===========================================================================
+# https://gitlab.isc.org/isc-projects/autoconf-archive/ax_jemalloc.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CHECK_JEMALLOC([, ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+#
+# DESCRIPTION
+#
+# Test for the jemalloc library in a path
+#
+# LICENSE
+#
+# Copyright (c) 2021 Internet Systems Consortium
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+#
+AC_DEFUN([AX_CHECK_JEMALLOC], [
+ found=false
+ PKG_CHECK_MODULES(
+ [JEMALLOC], [jemalloc],
+ [
+ found=true
+ ], [
+ AC_CHECK_HEADERS([malloc_np.h jemalloc/jemalloc.h],
+ [
+ save_LIBS="$LIBS"
+ save_LDFLAGS="$LDFLAGS"
+ save_CPPFLAGS="$CPPFLAGS"
+ AC_SEARCH_LIBS([mallocx], [jemalloc],
+ [
+ found=true
+ AS_IF([test "$ac_cv_search_mallocx" != "none required"],
+ [JEMALLOC_LIBS="$ac_cv_search_mallocx"])
+ ])
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ])
+ ])
+
+ AS_IF([$found], [$1], [$2])
+
+ AC_SUBST([JEMALLOC_CFLAGS])
+ AC_SUBST([JEMALLOC_LIBS])
+])
./lib/isc/include/pkcs11/pkcs11.h X 2019,2020,2021
./lib/isc/interfaceiter.c C 1999,2000,2001,2002,2003,2004,2005,2007,2008,2014,2016,2017,2018,2019,2020,2021
./lib/isc/iterated_hash.c C 2006,2008,2009,2016,2018,2019,2020,2021
+./lib/isc/jemalloc_shim.h C 2021
./lib/isc/lex.c C 1998,1999,2000,2001,2002,2003,2004,2005,2007,2013,2014,2015,2016,2017,2018,2019,2020,2021
./lib/isc/lib.c C 1999,2000,2001,2004,2005,2007,2009,2013,2014,2015,2016,2018,2019,2020,2021
./lib/isc/log.c C 1999,2000,2001,2002,2003,2004,2005,2006,2007,2009,2011,2012,2013,2014,2016,2017,2018,2019,2020,2021