cc00a15770
jemalloc is configured. Modify arena_malloc() API to avoid unnecessary choose_arena() calls. Remove unnecessary code from choose_arena(). Enable lazy-lock by default, now that choose_arena() is both faster and out of the critical path. Implement objdir support in the build system.
531 lines
13 KiB
Plaintext
531 lines
13 KiB
Plaintext
dnl Process this file with autoconf to produce a configure script.
|
|
AC_INIT([Makefile.in])
|
|
|
|
srcroot=$srcdir
|
|
if test "x${srcroot}" = "x." ; then
|
|
srcroot=""
|
|
else
|
|
srcroot="${srcroot}/"
|
|
fi
|
|
AC_SUBST([srcroot])
|
|
abs_srcroot="`cd \"${srcdir}\"; pwd`/"
|
|
AC_SUBST([abs_srcroot])
|
|
|
|
objroot=""
|
|
AC_SUBST([objroot])
|
|
abs_objroot="`pwd`/"
|
|
AC_SUBST([abs_objroot])
|
|
|
|
dnl Munge install path variables.
|
|
if test "x$prefix" = "xNONE" ; then
|
|
prefix="/usr/local"
|
|
fi
|
|
if test "x$exec_prefix" = "xNONE" ; then
|
|
exec_prefix=$prefix
|
|
fi
|
|
PREFIX=$prefix
|
|
AC_SUBST([PREFIX])
|
|
BINDIR=`eval echo $bindir`
|
|
BINDIR=`eval echo $BINDIR`
|
|
AC_SUBST([BINDIR])
|
|
INCLUDEDIR=`eval echo $includedir`
|
|
INCLUDEDIR=`eval echo $INCLUDEDIR`
|
|
AC_SUBST([INCLUDEDIR])
|
|
LIBDIR=`eval echo $libdir`
|
|
LIBDIR=`eval echo $LIBDIR`
|
|
AC_SUBST([LIBDIR])
|
|
DATADIR=`eval echo $datadir`
|
|
DATADIR=`eval echo $DATADIR`
|
|
AC_SUBST([DATADIR])
|
|
MANDIR=`eval echo $mandir`
|
|
MANDIR=`eval echo $MANDIR`
|
|
AC_SUBST([MANDIR])
|
|
|
|
cfgoutputs="Makefile doc/jemalloc.3"
|
|
cfghdrs="src/jemalloc_defs.h"
|
|
|
|
dnl If CFLAGS isn't defined and using gcc, set CFLAGS to something reasonable.
|
|
dnl Otherwise, just prevent autoconf from molesting CFLAGS.
|
|
CFLAGS=$CFLAGS
|
|
AC_PROG_CC
|
|
if test "x$CFLAGS" = "x" ; then
|
|
no_CFLAGS="yes"
|
|
fi
|
|
if test "x$no_CFLAGS" = "xyes" -a "x$GCC" = "xyes" ; then
|
|
CFLAGS="-std=gnu99 -Wall -pipe -g3"
|
|
fi
|
|
dnl Append EXTRA_CFLAGS to CFLAGS, if defined.
|
|
if test "x$EXTRA_CFLAGS" != "x" ; then
|
|
CFLAGS="$CFLAGS $EXTRA_CFLAGS"
|
|
fi
|
|
dnl XXX These flags only work with newer versions of gcc.
|
|
if test "x$GCC" = "xyes" ; then
|
|
CFLAGS="${CFLAGS} -march=native -ftls-model=initial-exec"
|
|
fi
|
|
AC_PROG_CPP
|
|
|
|
dnl sizeof_ptr is needed by the build system.
|
|
AC_CHECK_SIZEOF([void *])
|
|
if test "x${ac_cv_sizeof_void_p}" = "x8" ; then
|
|
SIZEOF_PTR_2POW=3
|
|
elif test "x${ac_cv_sizeof_void_p}" = "x4" ; then
|
|
SIZEOF_PTR_2POW=2
|
|
else
|
|
AC_MSG_ERROR([Unsupported pointer size: ${ac_cv_sizeof_void_p}])
|
|
fi
|
|
AC_DEFINE_UNQUOTED([SIZEOF_PTR_2POW], [$SIZEOF_PTR_2POW])
|
|
|
|
AC_CANONICAL_HOST
|
|
dnl CPU-specific settings.
|
|
CPU_SPINWAIT=""
|
|
case "${host_cpu}" in
|
|
i[[345]]86)
|
|
;;
|
|
i686)
|
|
CPU_SPINWAIT='__asm__ volatile("pause")'
|
|
;;
|
|
x86_64)
|
|
CPU_SPINWAIT='__asm__ volatile("pause")'
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
AC_DEFINE_UNQUOTED([CPU_SPINWAIT], [$CPU_SPINWAIT])
|
|
|
|
dnl Platform-specific settings. abi and RPATH can probably be determined
|
|
dnl programmatically, but doing so is error-prone, which makes it generally
|
|
dnl not worth the trouble.
|
|
dnl
|
|
dnl Define cpp macros in CPPFLAGS, rather than doing AC_DEFINE(macro), since the
|
|
dnl definitions need to be seen before any headers are included, which is a pain
|
|
dnl to make happen otherwise.
|
|
case "${host}" in
|
|
*-*-darwin*)
|
|
CFLAGS="$CFLAGS -fno-common -no-cpp-precomp"
|
|
abi="macho"
|
|
RPATH=""
|
|
;;
|
|
*-*-freebsd*)
|
|
CFLAGS="$CFLAGS"
|
|
abi="elf"
|
|
RPATH="-Wl,-rpath,"
|
|
;;
|
|
*-*-linux*)
|
|
CFLAGS="$CFLAGS"
|
|
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
|
|
abi="elf"
|
|
RPATH="-Wl,-rpath,"
|
|
;;
|
|
*-*-netbsd*)
|
|
AC_MSG_CHECKING([ABI])
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|
[[#ifdef __ELF__
|
|
/* ELF */
|
|
#else
|
|
#error aout
|
|
#endif
|
|
]])],
|
|
[CFLAGS="$CFLAGS"; abi="elf"],
|
|
[abi="aout"])
|
|
AC_MSG_RESULT([$abi])
|
|
RPATH="-Wl,-rpath,"
|
|
;;
|
|
*-*-solaris2*)
|
|
CFLAGS="$CFLAGS"
|
|
abi="elf"
|
|
RPATH="-Wl,-R,"
|
|
dnl Solaris needs this for sigwait().
|
|
CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
|
LIBS="$LIBS -lposix4 -lsocket -lnsl"
|
|
;;
|
|
*)
|
|
AC_MSG_RESULT([Unsupported operating system: ${host}])
|
|
abi="elf"
|
|
RPATH="-Wl,-rpath,"
|
|
;;
|
|
esac
|
|
AC_SUBST([abi])
|
|
AC_SUBST([RPATH])
|
|
|
|
dnl Support optional additions to rpath.
|
|
AC_ARG_WITH([rpath],
|
|
[AS_HELP_STRING([--with-rpath=<rpath>], [colon-separated rpath (ELF systems only)])],
|
|
if test "x$with_rpath" = "xno" ; then
|
|
RPATH_EXTRA=
|
|
else
|
|
RPATH_EXTRA="`echo $with_rpath | tr \":\" \" \"`"
|
|
fi,
|
|
RPATH_EXTRA=
|
|
)
|
|
AC_SUBST([RPATH_EXTRA])
|
|
|
|
dnl Disable rules that do automatic regeneration of configure output by default.
|
|
AC_ARG_ENABLE([autogen],
|
|
[AS_HELP_STRING[--enable-autogen], [Automatically regenerate configure output])],
|
|
if test "x$enable_autogen" = "xno" ; then
|
|
enable_autogen="0"
|
|
else
|
|
enable_autogen="1"
|
|
fi
|
|
,
|
|
enable_autogen="0"
|
|
)
|
|
AC_SUBST([enable_autogen])
|
|
|
|
AC_PROG_INSTALL
|
|
AC_PROG_RANLIB
|
|
AC_PATH_PROG([AR], [ar], , [$PATH])
|
|
AC_PATH_PROG([LD], [ld], , [$PATH])
|
|
AC_PATH_PROG([AUTOCONF], [autoconf], , [$PATH])
|
|
|
|
dnl Do not compile with debugging by default.
|
|
AC_ARG_ENABLE([debug],
|
|
[AS_HELP_STRING([--enable-debug], [Build debugging code])],
|
|
[if test "x$enable_debug" = "xno" ; then
|
|
enable_debug="0"
|
|
else
|
|
enable_debug="1"
|
|
fi
|
|
],
|
|
[enable_debug="0"]
|
|
)
|
|
if test "x$enable_debug" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_DEBUG], [ ])
|
|
fi
|
|
AC_SUBST([enable_debug])
|
|
|
|
dnl Only optimize if not debugging.
|
|
if test "x$enable_debug" = "x0" -a "x$no_CFLAGS" = "xyes" ; then
|
|
dnl Make sure that an optimization flag was not specified in EXTRA_CFLAGS.
|
|
if test "x$GCC" = "xyes" ; then
|
|
echo "$EXTRA_CFLAGS" | grep "\-O" >/dev/null || CFLAGS="$CFLAGS -O3 -funroll-loops -fomit-frame-pointer"
|
|
else
|
|
echo "$EXTRA_CFLAGS" | grep "\-O" >/dev/null || CFLAGS="$CFLAGS -O"
|
|
fi
|
|
fi
|
|
|
|
dnl Do not enable statistics calculation by default.
|
|
AC_ARG_ENABLE([stats],
|
|
[AS_HELP_STRING([--enable-stats], [Enable statistics calculation/reporting])],
|
|
[if test "x$enable_stats" = "xno" ; then
|
|
enable_stats="0"
|
|
else
|
|
enable_stats="1"
|
|
fi
|
|
],
|
|
[enable_stats="0"]
|
|
)
|
|
if test "x$enable_stats" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_STATS], [ ])
|
|
fi
|
|
AC_SUBST([enable_stats])
|
|
if test "x$enable_stats" = "x0" ; then
|
|
roff_stats=".\\\" "
|
|
else
|
|
roff_stats=""
|
|
fi
|
|
AC_SUBST([roff_stats])
|
|
|
|
dnl Enable tiny allocations by default.
|
|
AC_ARG_ENABLE([tiny],
|
|
[AS_HELP_STRING([--disable-tiny], [Disable tiny (sub-quantum) allocations])],
|
|
[if test "x$enable_tiny" = "xno" ; then
|
|
enable_tiny="0"
|
|
else
|
|
enable_tiny="1"
|
|
fi
|
|
],
|
|
[enable_tiny="1"]
|
|
)
|
|
if test "x$enable_tiny" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_TINY], [ ])
|
|
fi
|
|
AC_SUBST([enable_tiny])
|
|
if test "x$enable_tiny" = "x0" ; then
|
|
roff_tiny=".\\\" "
|
|
roff_no_tiny=""
|
|
else
|
|
roff_tiny=""
|
|
roff_no_tiny=".\\\" "
|
|
fi
|
|
AC_SUBST([roff_tiny])
|
|
AC_SUBST([roff_no_tiny])
|
|
|
|
dnl Enable magazines by default.
|
|
AC_ARG_ENABLE([mag],
|
|
[AS_HELP_STRING([--disable-mag], [Disable magazines (per thread caches)])],
|
|
[if test "x$enable_mag" = "xno" ; then
|
|
enable_mag="0"
|
|
else
|
|
enable_mag="1"
|
|
fi
|
|
],
|
|
[enable_mag="1"]
|
|
)
|
|
if test "x$enable_mag" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_MAG], [ ])
|
|
fi
|
|
AC_SUBST([enable_mag])
|
|
if test "x$enable_mag" = "x0" ; then
|
|
roff_mag=".\\\" "
|
|
else
|
|
roff_mag=""
|
|
fi
|
|
AC_SUBST([roff_mag])
|
|
|
|
dnl Enable dynamic arena load balancing by default.
|
|
AC_ARG_ENABLE([balance],
|
|
[AS_HELP_STRING([--disable-balance], [Disable dynamic arena load balancing])],
|
|
[if test "x$enable_balance" = "xno" ; then
|
|
enable_balance="0"
|
|
else
|
|
enable_balance="1"
|
|
fi
|
|
],
|
|
[enable_balance="1"]
|
|
)
|
|
if test "x$enable_balance" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_BALANCE], [ ])
|
|
fi
|
|
AC_SUBST([enable_balance])
|
|
if test "x$enable_balance" = "x0" ; then
|
|
roff_balance=".\\\" "
|
|
else
|
|
roff_balance=""
|
|
fi
|
|
AC_SUBST([roff_balance])
|
|
|
|
dnl Do not enable allocation from DSS by default.
|
|
AC_ARG_ENABLE([dss],
|
|
[AS_HELP_STRING([--enable-dss], [Enable allocation from DSS])],
|
|
[if test "x$enable_dss" = "xno" ; then
|
|
enable_dss="0"
|
|
else
|
|
enable_dss="1"
|
|
fi
|
|
],
|
|
[enable_dss="0"]
|
|
)
|
|
if test "x$enable_dss" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_DSS], [ ])
|
|
fi
|
|
AC_SUBST([enable_dss])
|
|
if test "x$enable_dss" = "x0" ; then
|
|
roff_dss=".\\\" "
|
|
else
|
|
roff_dss=""
|
|
fi
|
|
AC_SUBST([roff_dss])
|
|
|
|
dnl Do not support the junk/zero filling option by default.
|
|
AC_ARG_ENABLE([fill],
|
|
[AS_HELP_STRING([--enable-fill], [Support junk/zero filling option])],
|
|
[if test "x$enable_fill" = "xno" ; then
|
|
enable_fill="0"
|
|
else
|
|
enable_fill="1"
|
|
fi
|
|
],
|
|
[enable_fill="0"]
|
|
)
|
|
if test "x$enable_fill" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_FILL], [ ])
|
|
fi
|
|
AC_SUBST([enable_fill])
|
|
if test "x$enable_fill" = "x0" ; then
|
|
roff_fill=".\\\" "
|
|
else
|
|
roff_fill=""
|
|
fi
|
|
AC_SUBST([roff_fill])
|
|
|
|
dnl Do not support the xmalloc option by default.
|
|
AC_ARG_ENABLE([xmalloc],
|
|
[AS_HELP_STRING([--enable-xmalloc], [Support xmalloc option])],
|
|
[if test "x$enable_xmalloc" = "xno" ; then
|
|
enable_xmalloc="0"
|
|
else
|
|
enable_xmalloc="1"
|
|
fi
|
|
],
|
|
[enable_xmalloc="0"]
|
|
)
|
|
if test "x$enable_xmalloc" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_XMALLOC], [ ])
|
|
fi
|
|
AC_SUBST([enable_xmalloc])
|
|
if test "x$enable_xmalloc" = "x0" ; then
|
|
roff_xmalloc=".\\\" "
|
|
else
|
|
roff_xmalloc=""
|
|
fi
|
|
AC_SUBST([roff_xmalloc])
|
|
|
|
dnl Do not support the SYSV option by default.
|
|
AC_ARG_ENABLE([sysv],
|
|
[AS_HELP_STRING([--enable-sysv], [Support SYSV semantics option])],
|
|
[if test "x$enable_sysv" = "xno" ; then
|
|
enable_sysv="0"
|
|
else
|
|
enable_sysv="1"
|
|
fi
|
|
],
|
|
[enable_sysv="0"]
|
|
)
|
|
if test "x$enable_sysv" = "x1" ; then
|
|
AC_DEFINE([JEMALLOC_SYSV], [ ])
|
|
fi
|
|
AC_SUBST([enable_sysv])
|
|
if test "x$enable_sysv" = "x0" ; then
|
|
roff_sysv=".\\\" "
|
|
else
|
|
roff_sysv=""
|
|
fi
|
|
AC_SUBST([roff_sysv])
|
|
|
|
dnl Do not determine page shift at run time by default.
|
|
AC_ARG_ENABLE([dynamic_page_shift],
|
|
[AS_HELP_STRING([--enable-dynamic-page-shift],
|
|
[Determine page size at run time (don't trust configure result)])],
|
|
[if test "x$enable_dynamic_page_shift" = "xno" ; then
|
|
enable_dynamic_page_shift="0"
|
|
else
|
|
enable_dynamic_page_shift="1"
|
|
fi
|
|
],
|
|
[enable_dynamic_page_shift="0"]
|
|
)
|
|
if test "x$enable_dynamic_page_shift" = "x1" ; then
|
|
AC_DEFINE([DYNAMIC_PAGE_SHIFT], [ ])
|
|
fi
|
|
AC_SUBST([enable_dynamic_page_shift])
|
|
|
|
AC_MSG_CHECKING([STATIC_PAGE_SHIFT])
|
|
AC_RUN_IFELSE([AC_LANG_PROGRAM(
|
|
[[#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <strings.h>
|
|
]], [[
|
|
long result;
|
|
FILE *f;
|
|
|
|
result = sysconf(_SC_PAGESIZE);
|
|
if (result == -1) {
|
|
return 1;
|
|
}
|
|
f = fopen("conftest.out", "w");
|
|
if (f == NULL) {
|
|
return 1;
|
|
}
|
|
fprintf(f, "%u\n", ffs((int)result) - 1);
|
|
close(f);
|
|
|
|
return 0;
|
|
]])],
|
|
[STATIC_PAGE_SHIFT=`cat conftest.out`]
|
|
AC_MSG_RESULT([$STATIC_PAGE_SHIFT])
|
|
AC_DEFINE_UNQUOTED([STATIC_PAGE_SHIFT], [$STATIC_PAGE_SHIFT]),
|
|
AC_MSG_RESULT([error]))
|
|
|
|
dnl ============================================================================
|
|
dnl jemalloc configuration.
|
|
dnl
|
|
jemalloc_version=`cat ${srcroot}VERSION`
|
|
AC_DEFINE_UNQUOTED([JEMALLOC_VERSION], ["$jemalloc_version"])
|
|
AC_SUBST([jemalloc_version])
|
|
|
|
dnl ============================================================================
|
|
dnl Configure pthreads.
|
|
|
|
AC_CHECK_HEADERS([pthread.h], , [AC_MSG_ERROR([pthread.h is missing])])
|
|
AC_CHECK_LIB([pthread], [pthread_create], [LIBS="$LIBS -lpthread"],
|
|
[AC_MSG_ERROR([libpthread is missing])])
|
|
|
|
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
|
|
|
|
AC_MSG_CHECKING([for TLS])
|
|
AC_RUN_IFELSE([AC_LANG_PROGRAM(
|
|
[[
|
|
__thread int x;
|
|
]], [[
|
|
x = 42;
|
|
|
|
return 0;
|
|
]])],
|
|
AC_MSG_RESULT([yes])
|
|
roff_tls="",
|
|
AC_MSG_RESULT([no])
|
|
roff_tls=".\\\" "
|
|
AC_DEFINE_UNQUOTED([NO_TLS], [ ]))
|
|
AC_SUBST([roff_tls])
|
|
|
|
dnl Enable lazy locking by default.
|
|
AC_ARG_ENABLE([lazy_lock],
|
|
[AS_HELP_STRING([--enable-lazy-lock],
|
|
[Disable lazy locking (always lock, even when single-threaded)])],
|
|
[if test "x$enable_lazy_lock" = "xno" ; then
|
|
enable_lazy_lock="0"
|
|
else
|
|
enable_lazy_lock="1"
|
|
fi
|
|
],
|
|
[enable_lazy_lock="1"]
|
|
)
|
|
if test "x$enable_lazy_lock" = "x1" ; then
|
|
AC_CHECK_HEADERS([dlfcn.h], , [AC_MSG_ERROR([dlfcn.h is missing])])
|
|
AC_CHECK_LIB([dl], [dlopen], [LIBS="$LIBS -ldl"],
|
|
[AC_MSG_ERROR([libdl is missing])])
|
|
AC_DEFINE([JEMALLOC_LAZY_LOCK], [ ])
|
|
fi
|
|
AC_SUBST([enable_lazy_lock])
|
|
|
|
dnl ============================================================================
|
|
dnl Check for typedefs, structures, and compiler characteristics.
|
|
AC_HEADER_STDBOOL
|
|
|
|
dnl Process .in files.
|
|
AC_SUBST([cfghdrs])
|
|
AC_CONFIG_HEADERS([$cfghdrs cfghdrs.stamp])
|
|
|
|
dnl ============================================================================
|
|
dnl Generate outputs.
|
|
AC_CONFIG_FILES([$cfgoutputs cfgoutputs.stamp])
|
|
AC_SUBST([cfgoutputs])
|
|
AC_OUTPUT
|
|
|
|
dnl ============================================================================
|
|
dnl Print out the results of configuration.
|
|
AC_MSG_RESULT([===============================================================================])
|
|
AC_MSG_RESULT([jemalloc version : $jemalloc_version])
|
|
AC_MSG_RESULT([])
|
|
AC_MSG_RESULT([CC : ${CC}])
|
|
AC_MSG_RESULT([CPPFLAGS : ${CPPFLAGS}])
|
|
AC_MSG_RESULT([CFLAGS : ${CFLAGS}])
|
|
AC_MSG_RESULT([LDFLAGS : ${LDFLAGS}])
|
|
AC_MSG_RESULT([LIBS : ${LIBS}])
|
|
AC_MSG_RESULT([RPATH_EXTRA : ${RPATH_EXTRA}])
|
|
AC_MSG_RESULT([])
|
|
AC_MSG_RESULT([PREFIX : ${PREFIX}])
|
|
AC_MSG_RESULT([BINDIR : ${BINDIR}])
|
|
AC_MSG_RESULT([DATADIR : ${DATADIR}])
|
|
AC_MSG_RESULT([MANDIR : ${MANDIR}])
|
|
AC_MSG_RESULT([])
|
|
AC_MSG_RESULT([srcroot : ${srcroot}])
|
|
AC_MSG_RESULT([abs_srcroot : ${abs_srcroot}])
|
|
AC_MSG_RESULT([objroot : ${objroot}])
|
|
AC_MSG_RESULT([abs_objroot : ${abs_objroot}])
|
|
AC_MSG_RESULT([])
|
|
AC_MSG_RESULT([autogen : ${enable_autogen}])
|
|
AC_MSG_RESULT([debug : ${enable_debug}])
|
|
AC_MSG_RESULT([stats : ${enable_stats}])
|
|
AC_MSG_RESULT([tiny : ${enable_tiny}])
|
|
AC_MSG_RESULT([mag : ${enable_mag}])
|
|
AC_MSG_RESULT([balance : ${enable_balance}])
|
|
AC_MSG_RESULT([fill : ${enable_fill}])
|
|
AC_MSG_RESULT([xmalloc : ${enable_xmalloc}])
|
|
AC_MSG_RESULT([sysv : ${enable_sysv}])
|
|
AC_MSG_RESULT([dss : ${enable_dss}])
|
|
AC_MSG_RESULT([dynamic_page_shift : ${enable_dynamic_page_shift}])
|
|
AC_MSG_RESULT([lazy_lock : ${enable_lazy_lock}])
|
|
AC_MSG_RESULT([===============================================================================])
|