mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-30 19:42:00 +00:00
Using jemalloc instead of tcmalloc. (#2773)
* Added jemalloc as submodule [#CLICKHOUSE-2] * Imported jemalloc-cmake [#CLICKHOUSE-2] * Added README for jemalloc-cmake [#CLICKHOUSE-2] * Trying to add jemalloc [#CLICKHOUSE-2] * Trying to add jemalloc [#CLICKHOUSE-2] * Trying to add jemalloc [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2] * Add support for jemalloc: development [#CLICKHOUSE-2]
This commit is contained in:
parent
00cc4be7c9
commit
9cd5228df2
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -37,3 +37,6 @@
|
|||||||
[submodule "contrib/llvm"]
|
[submodule "contrib/llvm"]
|
||||||
path = contrib/llvm
|
path = contrib/llvm
|
||||||
url = https://github.com/ClickHouse-Extras/llvm
|
url = https://github.com/ClickHouse-Extras/llvm
|
||||||
|
[submodule "contrib/jemalloc"]
|
||||||
|
path = contrib/jemalloc
|
||||||
|
url = https://github.com/jemalloc/jemalloc.git
|
||||||
|
4
contrib/CMakeLists.txt
vendored
4
contrib/CMakeLists.txt
vendored
@ -85,6 +85,10 @@ if (ENABLE_TCMALLOC AND USE_INTERNAL_GPERFTOOLS_LIBRARY)
|
|||||||
add_subdirectory (libtcmalloc)
|
add_subdirectory (libtcmalloc)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (ENABLE_JEMALLOC AND USE_INTERNAL_JEMALLOC_LIBRARY)
|
||||||
|
add_subdirectory (jemalloc-cmake)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (USE_INTERNAL_CPUID_LIBRARY)
|
if (USE_INTERNAL_CPUID_LIBRARY)
|
||||||
add_subdirectory (libcpuid)
|
add_subdirectory (libcpuid)
|
||||||
endif ()
|
endif ()
|
||||||
|
1
contrib/jemalloc
vendored
Submodule
1
contrib/jemalloc
vendored
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 41b7372eadee941b9164751b8d4963f915d3ceae
|
52
contrib/jemalloc-cmake/CMakeLists.txt
Normal file
52
contrib/jemalloc-cmake/CMakeLists.txt
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
set(JEMALLOC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/contrib/jemalloc)
|
||||||
|
|
||||||
|
set(SRCS
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/arena.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/background_thread.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/base.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/bin.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/bitmap.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/ckh.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/ctl.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/div.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/extent.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/extent_dss.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/extent_mmap.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/hash.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/hook.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/jemalloc.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/jemalloc_cpp.cpp
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/large.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/log.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/malloc_io.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/mutex.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/mutex_pool.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/nstime.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/pages.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/prng.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/prof.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/rtree.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/sc.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/stats.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/sz.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/tcache.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/test_hooks.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/ticker.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/tsd.c
|
||||||
|
${JEMALLOC_SOURCE_DIR}/src/witness.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||||
|
list(APPEND SRCS src/zone.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(jemalloc STATIC ${SRCS})
|
||||||
|
|
||||||
|
target_include_directories(jemalloc PUBLIC
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include_linux_x86_64) # jemalloc.h
|
||||||
|
|
||||||
|
target_include_directories(jemalloc PRIVATE
|
||||||
|
${JEMALLOC_SOURCE_DIR}/include)
|
||||||
|
|
||||||
|
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
|
1
contrib/jemalloc-cmake/README
Normal file
1
contrib/jemalloc-cmake/README
Normal file
@ -0,0 +1 @@
|
|||||||
|
It allows to integrate JEMalloc into CMake project.
|
16
contrib/jemalloc-cmake/include/jemalloc/jemalloc.h
Normal file
16
contrib/jemalloc-cmake/include/jemalloc/jemalloc.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <jemalloc/jemalloc_defs.h>
|
||||||
|
#include <jemalloc/jemalloc_rename.h>
|
||||||
|
#include <jemalloc/jemalloc_macros.h>
|
||||||
|
#include <jemalloc/jemalloc_protos.h>
|
||||||
|
#include <jemalloc/jemalloc_typedefs.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
29
contrib/jemalloc-cmake/include/jemalloc/jemalloc_rename.h
Normal file
29
contrib/jemalloc-cmake/include/jemalloc/jemalloc_rename.h
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Name mangling for public symbols is controlled by --with-mangling and
|
||||||
|
* --with-jemalloc-prefix. With default settings the je_ prefix is stripped by
|
||||||
|
* these macro definitions.
|
||||||
|
*/
|
||||||
|
#ifndef JEMALLOC_NO_RENAME
|
||||||
|
# define je_aligned_alloc aligned_alloc
|
||||||
|
# define je_calloc calloc
|
||||||
|
# define je_dallocx dallocx
|
||||||
|
# define je_free free
|
||||||
|
# define je_mallctl mallctl
|
||||||
|
# define je_mallctlbymib mallctlbymib
|
||||||
|
# define je_mallctlnametomib mallctlnametomib
|
||||||
|
# define je_malloc malloc
|
||||||
|
# define je_malloc_conf malloc_conf
|
||||||
|
# define je_malloc_message malloc_message
|
||||||
|
# define je_malloc_stats_print malloc_stats_print
|
||||||
|
# define je_malloc_usable_size malloc_usable_size
|
||||||
|
# define je_mallocx mallocx
|
||||||
|
# define je_nallocx nallocx
|
||||||
|
# define je_posix_memalign posix_memalign
|
||||||
|
# define je_rallocx rallocx
|
||||||
|
# define je_realloc realloc
|
||||||
|
# define je_sallocx sallocx
|
||||||
|
# define je_sdallocx sdallocx
|
||||||
|
# define je_xallocx xallocx
|
||||||
|
# define je_memalign memalign
|
||||||
|
# define je_valloc valloc
|
||||||
|
#endif
|
7
contrib/jemalloc-cmake/include_linux_x86_64/README
Normal file
7
contrib/jemalloc-cmake/include_linux_x86_64/README
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
Here are pre-generated files from jemalloc on Linux x86_64.
|
||||||
|
You can obtain these files by running ./autogen.sh inside jemalloc source directory.
|
||||||
|
|
||||||
|
Added #define GNU_SOURCE
|
||||||
|
Added JEMALLOC_OVERRIDE___POSIX_MEMALIGN because why not.
|
||||||
|
Removed JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF because it's non standard.
|
||||||
|
Removed JEMALLOC_PURGE_MADVISE_FREE because it's available only from Linux 4.5.
|
@ -0,0 +1,372 @@
|
|||||||
|
/* include/jemalloc/internal/jemalloc_internal_defs.h. Generated from jemalloc_internal_defs.h.in by configure. */
|
||||||
|
#ifndef JEMALLOC_INTERNAL_DEFS_H_
|
||||||
|
#define JEMALLOC_INTERNAL_DEFS_H_
|
||||||
|
|
||||||
|
#ifndef _GNU_SOURCE
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If JEMALLOC_PREFIX is defined via --with-jemalloc-prefix, it will cause all
|
||||||
|
* public APIs to be prefixed. This makes it possible, with some care, to use
|
||||||
|
* multiple allocators simultaneously.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_PREFIX */
|
||||||
|
/* #undef JEMALLOC_CPREFIX */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define overrides for non-standard allocator-related functions if they are
|
||||||
|
* present on the system.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_CALLOC
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_FREE
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_MALLOC
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_MEMALIGN
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_REALLOC
|
||||||
|
#define JEMALLOC_OVERRIDE___LIBC_VALLOC
|
||||||
|
#define JEMALLOC_OVERRIDE___POSIX_MEMALIGN
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JEMALLOC_PRIVATE_NAMESPACE is used as a prefix for all library-private APIs.
|
||||||
|
* For shared libraries, symbol visibility mechanisms prevent these symbols
|
||||||
|
* from being exported, but for static libraries, naming collisions are a real
|
||||||
|
* possibility.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_PRIVATE_NAMESPACE je_
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hyper-threaded CPUs may need a special instruction inside spin loops in
|
||||||
|
* order to yield to another virtual CPU.
|
||||||
|
*/
|
||||||
|
#define CPU_SPINWAIT __asm__ volatile("pause")
|
||||||
|
/* 1 if CPU_SPINWAIT is defined, 0 otherwise. */
|
||||||
|
#define HAVE_CPU_SPINWAIT 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Number of significant bits in virtual addresses. This may be less than the
|
||||||
|
* total number of bits in a pointer, e.g. on x64, for which the uppermost 16
|
||||||
|
* bits are the same as bit 47.
|
||||||
|
*/
|
||||||
|
#define LG_VADDR 48
|
||||||
|
|
||||||
|
/* Defined if C11 atomics are available. */
|
||||||
|
#define JEMALLOC_C11_ATOMICS 1
|
||||||
|
|
||||||
|
/* Defined if GCC __atomic atomics are available. */
|
||||||
|
#define JEMALLOC_GCC_ATOMIC_ATOMICS 1
|
||||||
|
|
||||||
|
/* Defined if GCC __sync atomics are available. */
|
||||||
|
#define JEMALLOC_GCC_SYNC_ATOMICS 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if __sync_add_and_fetch(uint32_t *, uint32_t) and
|
||||||
|
* __sync_sub_and_fetch(uint32_t *, uint32_t) are available, despite
|
||||||
|
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 not being defined (which means the
|
||||||
|
* functions are defined in libgcc instead of being inlines).
|
||||||
|
*/
|
||||||
|
/* #undef JE_FORCE_SYNC_COMPARE_AND_SWAP_4 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if __sync_add_and_fetch(uint64_t *, uint64_t) and
|
||||||
|
* __sync_sub_and_fetch(uint64_t *, uint64_t) are available, despite
|
||||||
|
* __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 not being defined (which means the
|
||||||
|
* functions are defined in libgcc instead of being inlines).
|
||||||
|
*/
|
||||||
|
/* #undef JE_FORCE_SYNC_COMPARE_AND_SWAP_8 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if __builtin_clz() and __builtin_clzl() are available.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_HAVE_BUILTIN_CLZ
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if os_unfair_lock_*() functions are available, as provided by Darwin.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_OS_UNFAIR_LOCK */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if OSSpin*() functions are available, as provided by Darwin, and
|
||||||
|
* documented in the spinlock(3) manual page.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_OSSPIN */
|
||||||
|
|
||||||
|
/* Defined if syscall(2) is usable. */
|
||||||
|
#define JEMALLOC_USE_SYSCALL
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if secure_getenv(3) is available.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_HAVE_SECURE_GETENV
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if issetugid(2) is available.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_HAVE_ISSETUGID */
|
||||||
|
|
||||||
|
/* Defined if pthread_atfork(3) is available. */
|
||||||
|
#define JEMALLOC_HAVE_PTHREAD_ATFORK
|
||||||
|
|
||||||
|
/* Defined if pthread_setname_np(3) is available. */
|
||||||
|
#define JEMALLOC_HAVE_PTHREAD_SETNAME_NP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if clock_gettime(CLOCK_MONOTONIC_COARSE, ...) is available.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_HAVE_CLOCK_MONOTONIC_COARSE 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if clock_gettime(CLOCK_MONOTONIC, ...) is available.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_HAVE_CLOCK_MONOTONIC 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if mach_absolute_time() is available.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_HAVE_MACH_ABSOLUTE_TIME */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if _malloc_thread_cleanup() exists. At least in the case of
|
||||||
|
* FreeBSD, pthread_key_create() allocates, which if used during malloc
|
||||||
|
* bootstrapping will cause recursion into the pthreads library. Therefore, if
|
||||||
|
* _malloc_thread_cleanup() exists, use it as the basis for thread cleanup in
|
||||||
|
* malloc_tsd.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_MALLOC_THREAD_CLEANUP */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if threaded initialization is known to be safe on this platform.
|
||||||
|
* Among other things, it must be possible to initialize a mutex without
|
||||||
|
* triggering allocation in order for threaded allocation to be safe.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_THREADED_INIT
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if the pthreads implementation defines
|
||||||
|
* _pthread_mutex_init_calloc_cb(), in which case the function is used in order
|
||||||
|
* to avoid recursive allocation during mutex initialization.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_MUTEX_INIT_CB */
|
||||||
|
|
||||||
|
/* Non-empty if the tls_model attribute is supported. */
|
||||||
|
#define JEMALLOC_TLS_MODEL __attribute__((tls_model("initial-exec")))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JEMALLOC_DEBUG enables assertions and other sanity checks, and disables
|
||||||
|
* inline functions.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_DEBUG */
|
||||||
|
|
||||||
|
/* JEMALLOC_STATS enables statistics calculation. */
|
||||||
|
#define JEMALLOC_STATS
|
||||||
|
|
||||||
|
/* JEMALLOC_PROF enables allocation profiling. */
|
||||||
|
/* #undef JEMALLOC_PROF */
|
||||||
|
|
||||||
|
/* Use libunwind for profile backtracing if defined. */
|
||||||
|
/* #undef JEMALLOC_PROF_LIBUNWIND */
|
||||||
|
|
||||||
|
/* Use libgcc for profile backtracing if defined. */
|
||||||
|
/* #undef JEMALLOC_PROF_LIBGCC */
|
||||||
|
|
||||||
|
/* Use gcc intrinsics for profile backtracing if defined. */
|
||||||
|
/* #undef JEMALLOC_PROF_GCC */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JEMALLOC_DSS enables use of sbrk(2) to allocate extents from the data storage
|
||||||
|
* segment (DSS).
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_DSS
|
||||||
|
|
||||||
|
/* Support memory filling (junk/zero). */
|
||||||
|
#define JEMALLOC_FILL
|
||||||
|
|
||||||
|
/* Support utrace(2)-based tracing. */
|
||||||
|
/* #undef JEMALLOC_UTRACE */
|
||||||
|
|
||||||
|
/* Support optional abort() on OOM. */
|
||||||
|
/* #undef JEMALLOC_XMALLOC */
|
||||||
|
|
||||||
|
/* Support lazy locking (avoid locking unless a second thread is launched). */
|
||||||
|
/* #undef JEMALLOC_LAZY_LOCK */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Minimum allocation alignment is 2^LG_QUANTUM bytes (ignoring tiny size
|
||||||
|
* classes).
|
||||||
|
*/
|
||||||
|
/* #undef LG_QUANTUM */
|
||||||
|
|
||||||
|
/* One page is 2^LG_PAGE bytes. */
|
||||||
|
#define LG_PAGE 12
|
||||||
|
|
||||||
|
/*
|
||||||
|
* One huge page is 2^LG_HUGEPAGE bytes. Note that this is defined even if the
|
||||||
|
* system does not explicitly support huge pages; system calls that require
|
||||||
|
* explicit huge page support are separately configured.
|
||||||
|
*/
|
||||||
|
#define LG_HUGEPAGE 21
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, adjacent virtual memory mappings with identical attributes
|
||||||
|
* automatically coalesce, and they fragment when changes are made to subranges.
|
||||||
|
* This is the normal order of things for mmap()/munmap(), but on Windows
|
||||||
|
* VirtualAlloc()/VirtualFree() operations must be precisely matched, i.e.
|
||||||
|
* mappings do *not* coalesce/fragment.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_MAPS_COALESCE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, retain memory for later reuse by default rather than using e.g.
|
||||||
|
* munmap() to unmap freed extents. This is enabled on 64-bit Linux because
|
||||||
|
* common sequences of mmap()/munmap() calls will cause virtual memory map
|
||||||
|
* holes.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_RETAIN
|
||||||
|
|
||||||
|
/* TLS is used to map arenas and magazine caches to threads. */
|
||||||
|
#define JEMALLOC_TLS
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used to mark unreachable code to quiet "end of non-void" compiler warnings.
|
||||||
|
* Don't use this directly; instead use unreachable() from util.h
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_INTERNAL_UNREACHABLE __builtin_unreachable
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ffs*() functions to use for bitmapping. Don't use these directly; instead,
|
||||||
|
* use ffs_*() from util.h.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_INTERNAL_FFSLL __builtin_ffsll
|
||||||
|
#define JEMALLOC_INTERNAL_FFSL __builtin_ffsl
|
||||||
|
#define JEMALLOC_INTERNAL_FFS __builtin_ffs
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, explicitly attempt to more uniformly distribute large allocation
|
||||||
|
* pointer alignments across all cache indices.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_CACHE_OBLIVIOUS
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, enable logging facilities. We make this a configure option to
|
||||||
|
* avoid taking extra branches everywhere.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_LOG */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Darwin (OS X) uses zones to work around Mach-O symbol override shortcomings.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_ZONE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods for determining whether the OS overcommits.
|
||||||
|
* JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY: Linux's
|
||||||
|
* /proc/sys/vm.overcommit_memory file.
|
||||||
|
* JEMALLOC_SYSCTL_VM_OVERCOMMIT: FreeBSD's vm.overcommit sysctl.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_SYSCTL_VM_OVERCOMMIT */
|
||||||
|
#define JEMALLOC_PROC_SYS_VM_OVERCOMMIT_MEMORY
|
||||||
|
|
||||||
|
/* Defined if madvise(2) is available. */
|
||||||
|
#define JEMALLOC_HAVE_MADVISE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if transparent huge pages are supported via the MADV_[NO]HUGEPAGE
|
||||||
|
* arguments to madvise(2).
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_HAVE_MADVISE_HUGE
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods for purging unused pages differ between operating systems.
|
||||||
|
*
|
||||||
|
* madvise(..., MADV_FREE) : This marks pages as being unused, such that they
|
||||||
|
* will be discarded rather than swapped out.
|
||||||
|
* madvise(..., MADV_DONTNEED) : If JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS is
|
||||||
|
* defined, this immediately discards pages,
|
||||||
|
* such that new pages will be demand-zeroed if
|
||||||
|
* the address region is later touched;
|
||||||
|
* otherwise this behaves similarly to
|
||||||
|
* MADV_FREE, though typically with higher
|
||||||
|
* system overhead.
|
||||||
|
*/
|
||||||
|
//#define JEMALLOC_PURGE_MADVISE_FREE
|
||||||
|
#define JEMALLOC_PURGE_MADVISE_DONTNEED
|
||||||
|
#define JEMALLOC_PURGE_MADVISE_DONTNEED_ZEROS
|
||||||
|
|
||||||
|
/* Defined if madvise(2) is available but MADV_FREE is not (x86 Linux only). */
|
||||||
|
/* #undef JEMALLOC_DEFINE_MADVISE_FREE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if MADV_DO[NT]DUMP is supported as an argument to madvise.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_MADVISE_DONTDUMP
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if transparent huge pages (THPs) are supported via the
|
||||||
|
* MADV_[NO]HUGEPAGE arguments to madvise(2), and THP support is enabled.
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_THP */
|
||||||
|
|
||||||
|
/* Define if operating system has alloca.h header. */
|
||||||
|
#define JEMALLOC_HAS_ALLOCA_H 1
|
||||||
|
|
||||||
|
/* C99 restrict keyword supported. */
|
||||||
|
#define JEMALLOC_HAS_RESTRICT 1
|
||||||
|
|
||||||
|
/* For use by hash code. */
|
||||||
|
/* #undef JEMALLOC_BIG_ENDIAN */
|
||||||
|
|
||||||
|
/* sizeof(int) == 2^LG_SIZEOF_INT. */
|
||||||
|
#define LG_SIZEOF_INT 2
|
||||||
|
|
||||||
|
/* sizeof(long) == 2^LG_SIZEOF_LONG. */
|
||||||
|
#define LG_SIZEOF_LONG 3
|
||||||
|
|
||||||
|
/* sizeof(long long) == 2^LG_SIZEOF_LONG_LONG. */
|
||||||
|
#define LG_SIZEOF_LONG_LONG 3
|
||||||
|
|
||||||
|
/* sizeof(intmax_t) == 2^LG_SIZEOF_INTMAX_T. */
|
||||||
|
#define LG_SIZEOF_INTMAX_T 3
|
||||||
|
|
||||||
|
/* glibc malloc hooks (__malloc_hook, __realloc_hook, __free_hook). */
|
||||||
|
#define JEMALLOC_GLIBC_MALLOC_HOOK
|
||||||
|
|
||||||
|
/* glibc memalign hook. */
|
||||||
|
#define JEMALLOC_GLIBC_MEMALIGN_HOOK
|
||||||
|
|
||||||
|
/* pthread support */
|
||||||
|
#define JEMALLOC_HAVE_PTHREAD
|
||||||
|
|
||||||
|
/* dlsym() support */
|
||||||
|
#define JEMALLOC_HAVE_DLSYM
|
||||||
|
|
||||||
|
/* Adaptive mutex support in pthreads. */
|
||||||
|
#define JEMALLOC_HAVE_PTHREAD_MUTEX_ADAPTIVE_NP
|
||||||
|
|
||||||
|
/* GNU specific sched_getcpu support */
|
||||||
|
#define JEMALLOC_HAVE_SCHED_GETCPU
|
||||||
|
|
||||||
|
/* GNU specific sched_setaffinity support */
|
||||||
|
#define JEMALLOC_HAVE_SCHED_SETAFFINITY
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, all the features necessary for background threads are present.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_BACKGROUND_THREAD 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, jemalloc symbols are not exported (doesn't work when
|
||||||
|
* JEMALLOC_PREFIX is not defined).
|
||||||
|
*/
|
||||||
|
/* #undef JEMALLOC_EXPORT */
|
||||||
|
|
||||||
|
/* config.malloc_conf options string. */
|
||||||
|
#define JEMALLOC_CONFIG_MALLOC_CONF ""
|
||||||
|
|
||||||
|
/* If defined, jemalloc takes the malloc/free/etc. symbol names. */
|
||||||
|
#define JEMALLOC_IS_MALLOC 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Defined if strerror_r returns char * if _GNU_SOURCE is defined.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
@ -0,0 +1,194 @@
|
|||||||
|
#ifndef JEMALLOC_PREAMBLE_H
|
||||||
|
#define JEMALLOC_PREAMBLE_H
|
||||||
|
|
||||||
|
#include "jemalloc_internal_defs.h"
|
||||||
|
#include "jemalloc/internal/jemalloc_internal_decls.h"
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_UTRACE
|
||||||
|
#include <sys/ktrace.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define JEMALLOC_NO_DEMANGLE
|
||||||
|
#ifdef JEMALLOC_JET
|
||||||
|
# undef JEMALLOC_IS_MALLOC
|
||||||
|
# define JEMALLOC_N(n) jet_##n
|
||||||
|
# include "jemalloc/internal/public_namespace.h"
|
||||||
|
# define JEMALLOC_NO_RENAME
|
||||||
|
# include "jemalloc/jemalloc.h"
|
||||||
|
# undef JEMALLOC_NO_RENAME
|
||||||
|
#else
|
||||||
|
# define JEMALLOC_N(n) je_##n
|
||||||
|
# include "jemalloc/jemalloc.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(JEMALLOC_OSATOMIC) || defined(JEMALLOC_OSSPIN))
|
||||||
|
#include <libkern/OSAtomic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_ZONE
|
||||||
|
#include <mach/mach_error.h>
|
||||||
|
#include <mach/mach_init.h>
|
||||||
|
#include <mach/vm_map.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "jemalloc/internal/jemalloc_internal_macros.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that the ordering matters here; the hook itself is name-mangled. We
|
||||||
|
* want the inclusion of hooks to happen early, so that we hook as much as
|
||||||
|
* possible.
|
||||||
|
*/
|
||||||
|
#ifndef JEMALLOC_NO_PRIVATE_NAMESPACE
|
||||||
|
# ifndef JEMALLOC_JET
|
||||||
|
# include "jemalloc/internal/private_namespace.h"
|
||||||
|
# else
|
||||||
|
# include "jemalloc/internal/private_namespace_jet.h"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#include "jemalloc/internal/test_hooks.h"
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_DEFINE_MADVISE_FREE
|
||||||
|
# define JEMALLOC_MADV_FREE 8
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const bool config_debug =
|
||||||
|
#ifdef JEMALLOC_DEBUG
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool have_dss =
|
||||||
|
#ifdef JEMALLOC_DSS
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool have_madvise_huge =
|
||||||
|
#ifdef JEMALLOC_HAVE_MADVISE_HUGE
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_fill =
|
||||||
|
#ifdef JEMALLOC_FILL
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_lazy_lock =
|
||||||
|
#ifdef JEMALLOC_LAZY_LOCK
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const char * const config_malloc_conf = JEMALLOC_CONFIG_MALLOC_CONF;
|
||||||
|
static const bool config_prof =
|
||||||
|
#ifdef JEMALLOC_PROF
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_prof_libgcc =
|
||||||
|
#ifdef JEMALLOC_PROF_LIBGCC
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_prof_libunwind =
|
||||||
|
#ifdef JEMALLOC_PROF_LIBUNWIND
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool maps_coalesce =
|
||||||
|
#ifdef JEMALLOC_MAPS_COALESCE
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_stats =
|
||||||
|
#ifdef JEMALLOC_STATS
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_tls =
|
||||||
|
#ifdef JEMALLOC_TLS
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_utrace =
|
||||||
|
#ifdef JEMALLOC_UTRACE
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_xmalloc =
|
||||||
|
#ifdef JEMALLOC_XMALLOC
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool config_cache_oblivious =
|
||||||
|
#ifdef JEMALLOC_CACHE_OBLIVIOUS
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
/*
|
||||||
|
* Undocumented, for jemalloc development use only at the moment. See the note
|
||||||
|
* in jemalloc/internal/log.h.
|
||||||
|
*/
|
||||||
|
static const bool config_log =
|
||||||
|
#ifdef JEMALLOC_LOG
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
#ifdef JEMALLOC_HAVE_SCHED_GETCPU
|
||||||
|
/* Currently percpu_arena depends on sched_getcpu. */
|
||||||
|
#define JEMALLOC_PERCPU_ARENA
|
||||||
|
#endif
|
||||||
|
static const bool have_percpu_arena =
|
||||||
|
#ifdef JEMALLOC_PERCPU_ARENA
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
/*
|
||||||
|
* Undocumented, and not recommended; the application should take full
|
||||||
|
* responsibility for tracking provenance.
|
||||||
|
*/
|
||||||
|
static const bool force_ivsalloc =
|
||||||
|
#ifdef JEMALLOC_FORCE_IVSALLOC
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
static const bool have_background_thread =
|
||||||
|
#ifdef JEMALLOC_BACKGROUND_THREAD
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
#endif /* JEMALLOC_PREAMBLE_H */
|
@ -0,0 +1,43 @@
|
|||||||
|
/* include/jemalloc/jemalloc_defs.h. Generated from jemalloc_defs.h.in by configure. */
|
||||||
|
/* Defined if __attribute__((...)) syntax is supported. */
|
||||||
|
#define JEMALLOC_HAVE_ATTR
|
||||||
|
|
||||||
|
/* Defined if alloc_size attribute is supported. */
|
||||||
|
#define JEMALLOC_HAVE_ATTR_ALLOC_SIZE
|
||||||
|
|
||||||
|
/* Defined if format(printf, ...) attribute is supported. */
|
||||||
|
#define JEMALLOC_HAVE_ATTR_FORMAT_PRINTF
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Define overrides for non-standard allocator-related functions if they are
|
||||||
|
* present on the system.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_OVERRIDE_MEMALIGN
|
||||||
|
#define JEMALLOC_OVERRIDE_VALLOC
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At least Linux omits the "const" in:
|
||||||
|
*
|
||||||
|
* size_t malloc_usable_size(const void *ptr);
|
||||||
|
*
|
||||||
|
* Match the operating system's prototype.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_USABLE_SIZE_CONST
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If defined, specify throw() for the public function prototypes when compiling
|
||||||
|
* with C++. The only justification for this is to match the prototypes that
|
||||||
|
* glibc defines.
|
||||||
|
*/
|
||||||
|
#define JEMALLOC_USE_CXX_THROW
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# ifdef _WIN64
|
||||||
|
# define LG_SIZEOF_PTR_WIN 3
|
||||||
|
# else
|
||||||
|
# define LG_SIZEOF_PTR_WIN 2
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* sizeof(void *) == 2^LG_SIZEOF_PTR. */
|
||||||
|
#define LG_SIZEOF_PTR 3
|
@ -0,0 +1,122 @@
|
|||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
|
#define JEMALLOC_VERSION "5.1.0-56-g41b7372eadee941b9164751b8d4963f915d3ceae"
|
||||||
|
#define JEMALLOC_VERSION_MAJOR 5
|
||||||
|
#define JEMALLOC_VERSION_MINOR 1
|
||||||
|
#define JEMALLOC_VERSION_BUGFIX 0
|
||||||
|
#define JEMALLOC_VERSION_NREV 56
|
||||||
|
#define JEMALLOC_VERSION_GID "41b7372eadee941b9164751b8d4963f915d3ceae"
|
||||||
|
|
||||||
|
#define MALLOCX_LG_ALIGN(la) ((int)(la))
|
||||||
|
#if LG_SIZEOF_PTR == 2
|
||||||
|
# define MALLOCX_ALIGN(a) ((int)(ffs((int)(a))-1))
|
||||||
|
#else
|
||||||
|
# define MALLOCX_ALIGN(a) \
|
||||||
|
((int)(((size_t)(a) < (size_t)INT_MAX) ? ffs((int)(a))-1 : \
|
||||||
|
ffs((int)(((size_t)(a))>>32))+31))
|
||||||
|
#endif
|
||||||
|
#define MALLOCX_ZERO ((int)0x40)
|
||||||
|
/*
|
||||||
|
* Bias tcache index bits so that 0 encodes "automatic tcache management", and 1
|
||||||
|
* encodes MALLOCX_TCACHE_NONE.
|
||||||
|
*/
|
||||||
|
#define MALLOCX_TCACHE(tc) ((int)(((tc)+2) << 8))
|
||||||
|
#define MALLOCX_TCACHE_NONE MALLOCX_TCACHE(-1)
|
||||||
|
/*
|
||||||
|
* Bias arena index bits so that 0 encodes "use an automatically chosen arena".
|
||||||
|
*/
|
||||||
|
#define MALLOCX_ARENA(a) ((((int)(a))+1) << 20)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use as arena index in "arena.<i>.{purge,decay,dss}" and
|
||||||
|
* "stats.arenas.<i>.*" mallctl interfaces to select all arenas. This
|
||||||
|
* definition is intentionally specified in raw decimal format to support
|
||||||
|
* cpp-based string concatenation, e.g.
|
||||||
|
*
|
||||||
|
* #define STRINGIFY_HELPER(x) #x
|
||||||
|
* #define STRINGIFY(x) STRINGIFY_HELPER(x)
|
||||||
|
*
|
||||||
|
* mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".purge", NULL, NULL, NULL,
|
||||||
|
* 0);
|
||||||
|
*/
|
||||||
|
#define MALLCTL_ARENAS_ALL 4096
|
||||||
|
/*
|
||||||
|
* Use as arena index in "stats.arenas.<i>.*" mallctl interfaces to select
|
||||||
|
* destroyed arenas.
|
||||||
|
*/
|
||||||
|
#define MALLCTL_ARENAS_DESTROYED 4097
|
||||||
|
|
||||||
|
#if defined(__cplusplus) && defined(JEMALLOC_USE_CXX_THROW)
|
||||||
|
# define JEMALLOC_CXX_THROW throw()
|
||||||
|
#else
|
||||||
|
# define JEMALLOC_CXX_THROW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# define JEMALLOC_ATTR(s)
|
||||||
|
# define JEMALLOC_ALIGNED(s) __declspec(align(s))
|
||||||
|
# define JEMALLOC_ALLOC_SIZE(s)
|
||||||
|
# define JEMALLOC_ALLOC_SIZE2(s1, s2)
|
||||||
|
# ifndef JEMALLOC_EXPORT
|
||||||
|
# ifdef DLLEXPORT
|
||||||
|
# define JEMALLOC_EXPORT __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define JEMALLOC_EXPORT __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# define JEMALLOC_FORMAT_PRINTF(s, i)
|
||||||
|
# define JEMALLOC_NOINLINE __declspec(noinline)
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# define JEMALLOC_NOTHROW __declspec(nothrow)
|
||||||
|
# else
|
||||||
|
# define JEMALLOC_NOTHROW
|
||||||
|
# endif
|
||||||
|
# define JEMALLOC_SECTION(s) __declspec(allocate(s))
|
||||||
|
# define JEMALLOC_RESTRICT_RETURN __declspec(restrict)
|
||||||
|
# if _MSC_VER >= 1900 && !defined(__EDG__)
|
||||||
|
# define JEMALLOC_ALLOCATOR __declspec(allocator)
|
||||||
|
# else
|
||||||
|
# define JEMALLOC_ALLOCATOR
|
||||||
|
# endif
|
||||||
|
#elif defined(JEMALLOC_HAVE_ATTR)
|
||||||
|
# define JEMALLOC_ATTR(s) __attribute__((s))
|
||||||
|
# define JEMALLOC_ALIGNED(s) JEMALLOC_ATTR(aligned(s))
|
||||||
|
# ifdef JEMALLOC_HAVE_ATTR_ALLOC_SIZE
|
||||||
|
# define JEMALLOC_ALLOC_SIZE(s) JEMALLOC_ATTR(alloc_size(s))
|
||||||
|
# define JEMALLOC_ALLOC_SIZE2(s1, s2) JEMALLOC_ATTR(alloc_size(s1, s2))
|
||||||
|
# else
|
||||||
|
# define JEMALLOC_ALLOC_SIZE(s)
|
||||||
|
# define JEMALLOC_ALLOC_SIZE2(s1, s2)
|
||||||
|
# endif
|
||||||
|
# ifndef JEMALLOC_EXPORT
|
||||||
|
# define JEMALLOC_EXPORT JEMALLOC_ATTR(visibility("default"))
|
||||||
|
# endif
|
||||||
|
# ifdef JEMALLOC_HAVE_ATTR_FORMAT_GNU_PRINTF
|
||||||
|
# define JEMALLOC_FORMAT_PRINTF(s, i) JEMALLOC_ATTR(format(gnu_printf, s, i))
|
||||||
|
# elif defined(JEMALLOC_HAVE_ATTR_FORMAT_PRINTF)
|
||||||
|
# define JEMALLOC_FORMAT_PRINTF(s, i) JEMALLOC_ATTR(format(printf, s, i))
|
||||||
|
# else
|
||||||
|
# define JEMALLOC_FORMAT_PRINTF(s, i)
|
||||||
|
# endif
|
||||||
|
# define JEMALLOC_NOINLINE JEMALLOC_ATTR(noinline)
|
||||||
|
# define JEMALLOC_NOTHROW JEMALLOC_ATTR(nothrow)
|
||||||
|
# define JEMALLOC_SECTION(s) JEMALLOC_ATTR(section(s))
|
||||||
|
# define JEMALLOC_RESTRICT_RETURN
|
||||||
|
# define JEMALLOC_ALLOCATOR
|
||||||
|
#else
|
||||||
|
# define JEMALLOC_ATTR(s)
|
||||||
|
# define JEMALLOC_ALIGNED(s)
|
||||||
|
# define JEMALLOC_ALLOC_SIZE(s)
|
||||||
|
# define JEMALLOC_ALLOC_SIZE2(s1, s2)
|
||||||
|
# define JEMALLOC_EXPORT
|
||||||
|
# define JEMALLOC_FORMAT_PRINTF(s, i)
|
||||||
|
# define JEMALLOC_NOINLINE
|
||||||
|
# define JEMALLOC_NOTHROW
|
||||||
|
# define JEMALLOC_SECTION(s)
|
||||||
|
# define JEMALLOC_RESTRICT_RETURN
|
||||||
|
# define JEMALLOC_ALLOCATOR
|
||||||
|
#endif
|
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* The je_ prefix on the following public symbol declarations is an artifact
|
||||||
|
* of namespace management, and should be omitted in application code unless
|
||||||
|
* JEMALLOC_NO_DEMANGLE is defined (see jemalloc_mangle.h).
|
||||||
|
*/
|
||||||
|
extern JEMALLOC_EXPORT const char *je_malloc_conf;
|
||||||
|
extern JEMALLOC_EXPORT void (*je_malloc_message)(void *cbopaque,
|
||||||
|
const char *s);
|
||||||
|
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_malloc(size_t size)
|
||||||
|
JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE(1);
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_calloc(size_t num, size_t size)
|
||||||
|
JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE2(1, 2);
|
||||||
|
JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_posix_memalign(void **memptr,
|
||||||
|
size_t alignment, size_t size) JEMALLOC_CXX_THROW JEMALLOC_ATTR(nonnull(1));
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_aligned_alloc(size_t alignment,
|
||||||
|
size_t size) JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc)
|
||||||
|
JEMALLOC_ALLOC_SIZE(2);
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_realloc(void *ptr, size_t size)
|
||||||
|
JEMALLOC_CXX_THROW JEMALLOC_ALLOC_SIZE(2);
|
||||||
|
JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_free(void *ptr)
|
||||||
|
JEMALLOC_CXX_THROW;
|
||||||
|
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_mallocx(size_t size, int flags)
|
||||||
|
JEMALLOC_ATTR(malloc) JEMALLOC_ALLOC_SIZE(1);
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_rallocx(void *ptr, size_t size,
|
||||||
|
int flags) JEMALLOC_ALLOC_SIZE(2);
|
||||||
|
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW je_xallocx(void *ptr, size_t size,
|
||||||
|
size_t extra, int flags);
|
||||||
|
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW je_sallocx(const void *ptr,
|
||||||
|
int flags) JEMALLOC_ATTR(pure);
|
||||||
|
JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_dallocx(void *ptr, int flags);
|
||||||
|
JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_sdallocx(void *ptr, size_t size,
|
||||||
|
int flags);
|
||||||
|
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW je_nallocx(size_t size, int flags)
|
||||||
|
JEMALLOC_ATTR(pure);
|
||||||
|
|
||||||
|
JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_mallctl(const char *name,
|
||||||
|
void *oldp, size_t *oldlenp, void *newp, size_t newlen);
|
||||||
|
JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_mallctlnametomib(const char *name,
|
||||||
|
size_t *mibp, size_t *miblenp);
|
||||||
|
JEMALLOC_EXPORT int JEMALLOC_NOTHROW je_mallctlbymib(const size_t *mib,
|
||||||
|
size_t miblen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
|
||||||
|
JEMALLOC_EXPORT void JEMALLOC_NOTHROW je_malloc_stats_print(
|
||||||
|
void (*write_cb)(void *, const char *), void *je_cbopaque,
|
||||||
|
const char *opts);
|
||||||
|
JEMALLOC_EXPORT size_t JEMALLOC_NOTHROW je_malloc_usable_size(
|
||||||
|
JEMALLOC_USABLE_SIZE_CONST void *ptr) JEMALLOC_CXX_THROW;
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_OVERRIDE_MEMALIGN
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_memalign(size_t alignment, size_t size)
|
||||||
|
JEMALLOC_CXX_THROW JEMALLOC_ATTR(malloc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef JEMALLOC_OVERRIDE_VALLOC
|
||||||
|
JEMALLOC_EXPORT JEMALLOC_ALLOCATOR JEMALLOC_RESTRICT_RETURN
|
||||||
|
void JEMALLOC_NOTHROW *je_valloc(size_t size) JEMALLOC_CXX_THROW
|
||||||
|
JEMALLOC_ATTR(malloc);
|
||||||
|
#endif
|
@ -0,0 +1,77 @@
|
|||||||
|
typedef struct extent_hooks_s extent_hooks_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* void *
|
||||||
|
* extent_alloc(extent_hooks_t *extent_hooks, void *new_addr, size_t size,
|
||||||
|
* size_t alignment, bool *zero, bool *commit, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef void *(extent_alloc_t)(extent_hooks_t *, void *, size_t, size_t, bool *,
|
||||||
|
bool *, unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_dalloc(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* bool committed, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_dalloc_t)(extent_hooks_t *, void *, size_t, bool,
|
||||||
|
unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* void
|
||||||
|
* extent_destroy(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* bool committed, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef void (extent_destroy_t)(extent_hooks_t *, void *, size_t, bool,
|
||||||
|
unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_commit(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* size_t offset, size_t length, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_commit_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
|
||||||
|
unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_decommit(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* size_t offset, size_t length, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_decommit_t)(extent_hooks_t *, void *, size_t, size_t,
|
||||||
|
size_t, unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_purge(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* size_t offset, size_t length, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_purge_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
|
||||||
|
unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_split(extent_hooks_t *extent_hooks, void *addr, size_t size,
|
||||||
|
* size_t size_a, size_t size_b, bool committed, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_split_t)(extent_hooks_t *, void *, size_t, size_t, size_t,
|
||||||
|
bool, unsigned);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bool
|
||||||
|
* extent_merge(extent_hooks_t *extent_hooks, void *addr_a, size_t size_a,
|
||||||
|
* void *addr_b, size_t size_b, bool committed, unsigned arena_ind);
|
||||||
|
*/
|
||||||
|
typedef bool (extent_merge_t)(extent_hooks_t *, void *, size_t, void *, size_t,
|
||||||
|
bool, unsigned);
|
||||||
|
|
||||||
|
struct extent_hooks_s {
|
||||||
|
extent_alloc_t *alloc;
|
||||||
|
extent_dalloc_t *dalloc;
|
||||||
|
extent_destroy_t *destroy;
|
||||||
|
extent_commit_t *commit;
|
||||||
|
extent_decommit_t *decommit;
|
||||||
|
extent_purge_t *purge_lazy;
|
||||||
|
extent_purge_t *purge_forced;
|
||||||
|
extent_split_t *split;
|
||||||
|
extent_merge_t *merge;
|
||||||
|
};
|
@ -27,6 +27,10 @@
|
|||||||
} malloc_extension_initializer;
|
} malloc_extension_initializer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_JEMALLOC
|
||||||
|
#include <jemalloc/jemalloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
@ -229,6 +233,36 @@ void AsynchronousMetrics::update()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_JEMALLOC
|
||||||
|
{
|
||||||
|
#define FOR_EACH_METRIC(M) \
|
||||||
|
M("allocated", size_t) \
|
||||||
|
M("active", size_t) \
|
||||||
|
M("metadata", size_t) \
|
||||||
|
M("metadata_thp", size_t) \
|
||||||
|
M("resident", size_t) \
|
||||||
|
M("mapped", size_t) \
|
||||||
|
M("retained", size_t) \
|
||||||
|
M("background_thread.num_threads", size_t) \
|
||||||
|
M("background_thread.num_runs", uint64_t) \
|
||||||
|
M("background_thread.run_interval", uint64_t) \
|
||||||
|
|
||||||
|
#define GET_METRIC(NAME, TYPE) \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
TYPE value{}; \
|
||||||
|
size_t size = sizeof(value); \
|
||||||
|
mallctl("stats." NAME, &value, &size, nullptr, 0); \
|
||||||
|
set("jemalloc." NAME, value); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
FOR_EACH_METRIC(GET_METRIC);
|
||||||
|
|
||||||
|
#undef GET_METRIC
|
||||||
|
#undef FOR_EACH_METRIC
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/// Add more metrics as you wish.
|
/// Add more metrics as you wish.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,26 +57,26 @@ add_library (common ${SPLIT_SHARED}
|
|||||||
${CONFIG_COMMON}
|
${CONFIG_COMMON}
|
||||||
)
|
)
|
||||||
|
|
||||||
# When testing for memory leaks, dont link tcmalloc or jemalloc.
|
# When testing for memory leaks with Valgrind, dont link tcmalloc or jemalloc.
|
||||||
|
|
||||||
if (USE_JEMALLOC)
|
if (USE_JEMALLOC)
|
||||||
message (STATUS "Link jemalloc : ${JEMALLOC_LIBRARIES}")
|
message (STATUS "Link jemalloc: ${JEMALLOC_LIBRARIES}")
|
||||||
set (MALLOC_LIBRARIES ${JEMALLOC_LIBRARIES})
|
set (MALLOC_LIBRARIES ${JEMALLOC_LIBRARIES})
|
||||||
elseif (USE_TCMALLOC)
|
|
||||||
|
|
||||||
|
elseif (USE_TCMALLOC)
|
||||||
if (DEBUG_TCMALLOC AND NOT GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG)
|
if (DEBUG_TCMALLOC AND NOT GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG)
|
||||||
message (WARNING "Requested DEBUG_TCMALLOC but debug lib not found. try install libgoogle-perftools-dev")
|
message (FATAL_ERROR "Requested DEBUG_TCMALLOC but debug library is not found. You should install Google Perftools. Example: sudo apt-get install libgoogle-perftools-dev")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (DEBUG_TCMALLOC AND GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG)
|
if (DEBUG_TCMALLOC AND GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG)
|
||||||
message (STATUS "Link libtcmalloc_minimal_debug for testing: ${GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG}")
|
message (STATUS "Link libtcmalloc_minimal_debug for testing: ${GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG}")
|
||||||
set (MALLOC_LIBRARIES ${GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG})
|
set (MALLOC_LIBRARIES ${GPERFTOOLS_TCMALLOC_MINIMAL_DEBUG})
|
||||||
else ()
|
else ()
|
||||||
message (STATUS "Link libtcmalloc_minimal : ${GPERFTOOLS_TCMALLOC_MINIMAL}")
|
message (STATUS "Link libtcmalloc_minimal: ${GPERFTOOLS_TCMALLOC_MINIMAL}")
|
||||||
set (MALLOC_LIBRARIES ${GPERFTOOLS_TCMALLOC_MINIMAL})
|
set (MALLOC_LIBRARIES ${GPERFTOOLS_TCMALLOC_MINIMAL})
|
||||||
endif ()
|
endif ()
|
||||||
else ()
|
else ()
|
||||||
message (STATUS "Disabling libtcmalloc for valgrind better analysis")
|
message (WARNING "Non default allocator is disabled. This is not recommended for production Linux builds.")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (GLIBC_COMPATIBILITY)
|
if (GLIBC_COMPATIBILITY)
|
||||||
|
@ -4,12 +4,7 @@ else ()
|
|||||||
option (USE_INTERNAL_GPERFTOOLS_LIBRARY "Set to FALSE to use system gperftools (tcmalloc) library instead of bundled" ${NOT_UNBUNDLED})
|
option (USE_INTERNAL_GPERFTOOLS_LIBRARY "Set to FALSE to use system gperftools (tcmalloc) library instead of bundled" ${NOT_UNBUNDLED})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (ARCH_FREEBSD OR MSVC)
|
option (ENABLE_TCMALLOC "Set to TRUE to enable tcmalloc" OFF)
|
||||||
option (ENABLE_TCMALLOC "Set to TRUE to enable tcmalloc" OFF)
|
|
||||||
else ()
|
|
||||||
option (ENABLE_TCMALLOC "Set to TRUE to enable tcmalloc" ON)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
option (DEBUG_TCMALLOC "Set to TRUE to use debug version of libtcmalloc" OFF)
|
option (DEBUG_TCMALLOC "Set to TRUE to use debug version of libtcmalloc" OFF)
|
||||||
|
|
||||||
if (ENABLE_TCMALLOC)
|
if (ENABLE_TCMALLOC)
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
option (ENABLE_JEMALLOC "Set to TRUE to use jemalloc instead of tcmalloc" OFF)
|
option (ENABLE_JEMALLOC "Set to TRUE to use jemalloc" ON)
|
||||||
|
option (USE_INTERNAL_JEMALLOC_LIBRARY "Set to FALSE to use system jemalloc library instead of bundled" ${NOT_UNBUNDLED})
|
||||||
|
|
||||||
if (ENABLE_JEMALLOC)
|
if (ENABLE_JEMALLOC)
|
||||||
find_package (JeMalloc)
|
if (USE_INTERNAL_JEMALLOC_LIBRARY)
|
||||||
|
set (JEMALLOC_LIBRARIES "jemalloc")
|
||||||
if (JEMALLOC_INCLUDE_DIR AND JEMALLOC_LIBRARIES)
|
else ()
|
||||||
set (USE_JEMALLOC 1)
|
find_package (JeMalloc)
|
||||||
if (USE_TCMALLOC)
|
|
||||||
message (WARNING "Disabling tcmalloc")
|
|
||||||
set (USE_TCMALLOC 0)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
endif ()
|
||||||
message (STATUS "Using jemalloc=${USE_JEMALLOC}: ${JEMALLOC_INCLUDE_DIR} : ${JEMALLOC_LIBRARIES}")
|
|
||||||
|
if (JEMALLOC_LIBRARIES)
|
||||||
|
set (USE_JEMALLOC 1)
|
||||||
|
else ()
|
||||||
|
message (FATAL_ERROR "ENABLE_JEMALLOC is set to true, but library was not found")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
message (STATUS "Using jemalloc=${USE_JEMALLOC}: ${JEMALLOC_LIBRARIES}")
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -32,7 +32,7 @@ cmake $CUR_DIR/../.. -DCMAKE_CXX_COMPILER=`which $DEB_CXX $CXX` -DCMAKE_C_COMPIL
|
|||||||
`# Use all possible contrib libs from system` \
|
`# Use all possible contrib libs from system` \
|
||||||
-DUNBUNDLED=1 \
|
-DUNBUNDLED=1 \
|
||||||
`# Disable all features` \
|
`# Disable all features` \
|
||||||
-DENABLE_CAPNP=0 -DENABLE_RDKAFKA=0 -DENABLE_EMBEDDED_COMPILER=0 -DENABLE_TCMALLOC=0 -DENABLE_UNWIND=0 -DENABLE_MYSQL=0 -DUSE_INTERNAL_LLVM_LIBRARY=0 $CMAKE_FLAGS \
|
-DENABLE_CAPNP=0 -DENABLE_RDKAFKA=0 -DENABLE_EMBEDDED_COMPILER=0 -DENABLE_TCMALLOC=0 -DENABLE_JEMALLOC=0 -DENABLE_UNWIND=0 -DENABLE_MYSQL=0 -DUSE_INTERNAL_LLVM_LIBRARY=0 $CMAKE_FLAGS \
|
||||||
&& ninja clickhouse-bundle \
|
&& ninja clickhouse-bundle \
|
||||||
`# Skip tests:` \
|
`# Skip tests:` \
|
||||||
`# 00281 requires internal compiler` \
|
`# 00281 requires internal compiler` \
|
||||||
|
@ -27,7 +27,7 @@ env TEST_RUN=${TEST_RUN=1} \
|
|||||||
CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=Debug -DUNBUNDLED=1 -DENABLE_UNWIND=0 -DENABLE_MYSQL=0 -DENABLE_CAPNP=0 -DENABLE_RDKAFKA=0 -DUSE_INTERNAL_LLVM_LIBRARY=0 -DCMAKE_C_FLAGS_ADD='-O0 -g0' -DCMAKE_CXX_FLAGS_ADD='-O0 -g0' $CMAKE_FLAGS" \
|
CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=Debug -DUNBUNDLED=1 -DENABLE_UNWIND=0 -DENABLE_MYSQL=0 -DENABLE_CAPNP=0 -DENABLE_RDKAFKA=0 -DUSE_INTERNAL_LLVM_LIBRARY=0 -DCMAKE_C_FLAGS_ADD='-O0 -g0' -DCMAKE_CXX_FLAGS_ADD='-O0 -g0' $CMAKE_FLAGS" \
|
||||||
`# Use all possible contrib libs from system` \
|
`# Use all possible contrib libs from system` \
|
||||||
`# psmisc - killall` \
|
`# psmisc - killall` \
|
||||||
EXTRAPACKAGES="psmisc clang-5.0 lld-5.0 liblld-5.0-dev libclang-5.0-dev liblld-5.0 libc++abi-dev libc++-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev zlib1g-dev liblz4-dev libdouble-conversion-dev libsparsehash-dev librdkafka-dev libpoco-dev libsparsehash-dev libgoogle-perftools-dev libzstd-dev libre2-dev $EXTRAPACKAGES" \
|
EXTRAPACKAGES="psmisc clang-5.0 lld-5.0 liblld-5.0-dev libclang-5.0-dev liblld-5.0 libc++abi-dev libc++-dev libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev zlib1g-dev liblz4-dev libdouble-conversion-dev libsparsehash-dev librdkafka-dev libpoco-dev libsparsehash-dev libgoogle-perftools-dev libzstd-dev libre2-dev libjemalloc-dev $EXTRAPACKAGES" \
|
||||||
`# Travis trusty cant unpack bionic: E: debootstrap failed, TODO: check again, can be fixed` \
|
`# Travis trusty cant unpack bionic: E: debootstrap failed, TODO: check again, can be fixed` \
|
||||||
DIST=${DIST=artful} \
|
DIST=${DIST=artful} \
|
||||||
$CUR_DIR/../../release $RELEASE_OPT
|
$CUR_DIR/../../release $RELEASE_OPT
|
||||||
|
Loading…
Reference in New Issue
Block a user