mirror of https://gitee.com/bigwinds/arangodb
upgrade jemalloc to 5.2.1 (#9816)
This commit is contained in:
parent
8e4c386086
commit
1176c38aa1
|
@ -4,7 +4,7 @@ project(jemalloc C)
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
|
|
||||||
# set version and paths
|
# set version and paths
|
||||||
set(JEMALLOC_VERSION "5.2.0")
|
set(JEMALLOC_VERSION "5.2.1")
|
||||||
set(JEMALLOC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/v${JEMALLOC_VERSION}")
|
set(JEMALLOC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/v${JEMALLOC_VERSION}")
|
||||||
set(JEMALLOC_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/v${JEMALLOC_VERSION}")
|
set(JEMALLOC_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/v${JEMALLOC_VERSION}")
|
||||||
|
|
||||||
|
|
|
@ -5,27 +5,27 @@ environment:
|
||||||
- MSYSTEM: MINGW64
|
- MSYSTEM: MINGW64
|
||||||
CPU: x86_64
|
CPU: x86_64
|
||||||
MSVC: amd64
|
MSVC: amd64
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
- MSYSTEM: MINGW32
|
- MSYSTEM: MINGW32
|
||||||
CPU: i686
|
CPU: i686
|
||||||
MSVC: x86
|
MSVC: x86
|
||||||
- MSYSTEM: MINGW64
|
CONFIG_FLAGS: --enable-debug
|
||||||
CPU: x86_64
|
|
||||||
- MSYSTEM: MINGW32
|
- MSYSTEM: MINGW32
|
||||||
CPU: i686
|
CPU: i686
|
||||||
|
CONFIG_FLAGS: --enable-debug
|
||||||
- MSYSTEM: MINGW64
|
- MSYSTEM: MINGW64
|
||||||
CPU: x86_64
|
CPU: x86_64
|
||||||
MSVC: amd64
|
MSVC: amd64
|
||||||
CONFIG_FLAGS: --enable-debug
|
- MSYSTEM: MINGW64
|
||||||
|
CPU: x86_64
|
||||||
- MSYSTEM: MINGW32
|
- MSYSTEM: MINGW32
|
||||||
CPU: i686
|
CPU: i686
|
||||||
MSVC: x86
|
MSVC: x86
|
||||||
CONFIG_FLAGS: --enable-debug
|
|
||||||
- MSYSTEM: MINGW64
|
|
||||||
CPU: x86_64
|
|
||||||
CONFIG_FLAGS: --enable-debug
|
|
||||||
- MSYSTEM: MINGW32
|
- MSYSTEM: MINGW32
|
||||||
CPU: i686
|
CPU: i686
|
||||||
CONFIG_FLAGS: --enable-debug
|
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- set PATH=c:\msys64\%MSYSTEM%\bin;c:\msys64\usr\bin;%PATH%
|
- set PATH=c:\msys64\%MSYSTEM%\bin;c:\msys64\usr\bin;%PATH%
|
|
@ -23,6 +23,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -41,6 +43,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: osx
|
- os: osx
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: osx
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: osx
|
- os: osx
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -54,6 +58,8 @@ matrix:
|
||||||
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=clang CXX=clang++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -74,6 +80,9 @@ matrix:
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
addons: *gcc_multilib
|
addons: *gcc_multilib
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
addons: *gcc_multilib
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="-m32" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
addons: *gcc_multilib
|
addons: *gcc_multilib
|
||||||
|
@ -92,6 +101,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-debug --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -104,6 +115,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --disable-stats" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -114,6 +127,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-prof --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --disable-libdl" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -122,6 +137,8 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-stats --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --enable-opt-safety-checks" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
|
@ -130,6 +147,14 @@ matrix:
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--disable-libdl --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks --with-malloc-conf=tcache:false" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks --with-malloc-conf=dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks --with-malloc-conf=percpu_arena:percpu" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
|
- os: linux
|
||||||
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--enable-opt-safety-checks --with-malloc-conf=background_thread:true" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false,dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
env: CC=gcc CXX=g++ COMPILER_FLAGS="" CONFIGURE_FLAGS="--with-malloc-conf=tcache:false,dss:primary" EXTRA_CFLAGS="-Werror -Wno-array-bounds"
|
||||||
- os: linux
|
- os: linux
|
|
@ -4,6 +4,39 @@ brevity. Much more detail can be found in the git revision history:
|
||||||
|
|
||||||
https://github.com/jemalloc/jemalloc
|
https://github.com/jemalloc/jemalloc
|
||||||
|
|
||||||
|
* 5.2.1 (August 5, 2019)
|
||||||
|
|
||||||
|
This release is primarily about Windows. A critical virtual memory leak is
|
||||||
|
resolved on all Windows platforms. The regression was present in all releases
|
||||||
|
since 5.0.0.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
- Fix a severe virtual memory leak on Windows. This regression was first
|
||||||
|
released in 5.0.0. (@Ignition, @j0t, @frederik-h, @davidtgoldblatt,
|
||||||
|
@interwq)
|
||||||
|
- Fix size 0 handling in posix_memalign(). This regression was first released
|
||||||
|
in 5.2.0. (@interwq)
|
||||||
|
- Fix the prof_log unit test which may observe unexpected backtraces from
|
||||||
|
compiler optimizations. The test was first added in 5.2.0. (@marxin,
|
||||||
|
@gnzlbg, @interwq)
|
||||||
|
- Fix the declaration of the extent_avail tree. This regression was first
|
||||||
|
released in 5.1.0. (@zoulasc)
|
||||||
|
- Fix an incorrect reference in jeprof. This functionality was first released
|
||||||
|
in 3.0.0. (@prehistoric-penguin)
|
||||||
|
- Fix an assertion on the deallocation fast-path. This regression was first
|
||||||
|
released in 5.2.0. (@yinan1048576)
|
||||||
|
- Fix the TLS_MODEL attribute in headers. This regression was first released
|
||||||
|
in 5.0.0. (@zoulasc, @interwq)
|
||||||
|
|
||||||
|
Optimizations and refactors:
|
||||||
|
- Implement opt.retain on Windows and enable by default on 64-bit. (@interwq,
|
||||||
|
@davidtgoldblatt)
|
||||||
|
- Optimize away a branch on the operator delete[] path. (@mgrice)
|
||||||
|
- Add format annotation to the format generator function. (@zoulasc)
|
||||||
|
- Refactor and improve the size class header generation. (@yinan1048576)
|
||||||
|
- Remove best fit. (@djwatson)
|
||||||
|
- Avoid blocking on background thread locks for stats. (@oranagra, @interwq)
|
||||||
|
|
||||||
* 5.2.0 (April 2, 2019)
|
* 5.2.0 (April 2, 2019)
|
||||||
|
|
||||||
This release includes a few notable improvements, which are summarized below:
|
This release includes a few notable improvements, which are summarized below:
|
|
@ -56,6 +56,7 @@ cfghdrs_out := @cfghdrs_out@
|
||||||
cfgoutputs_in := $(addprefix $(srcroot),@cfgoutputs_in@)
|
cfgoutputs_in := $(addprefix $(srcroot),@cfgoutputs_in@)
|
||||||
cfgoutputs_out := @cfgoutputs_out@
|
cfgoutputs_out := @cfgoutputs_out@
|
||||||
enable_autogen := @enable_autogen@
|
enable_autogen := @enable_autogen@
|
||||||
|
enable_doc := @enable_doc@
|
||||||
enable_shared := @enable_shared@
|
enable_shared := @enable_shared@
|
||||||
enable_static := @enable_static@
|
enable_static := @enable_static@
|
||||||
enable_prof := @enable_prof@
|
enable_prof := @enable_prof@
|
||||||
|
@ -117,6 +118,7 @@ C_SRCS := $(srcroot)src/jemalloc.c \
|
||||||
$(srcroot)src/prng.c \
|
$(srcroot)src/prng.c \
|
||||||
$(srcroot)src/prof.c \
|
$(srcroot)src/prof.c \
|
||||||
$(srcroot)src/rtree.c \
|
$(srcroot)src/rtree.c \
|
||||||
|
$(srcroot)src/safety_check.c \
|
||||||
$(srcroot)src/stats.c \
|
$(srcroot)src/stats.c \
|
||||||
$(srcroot)src/sc.c \
|
$(srcroot)src/sc.c \
|
||||||
$(srcroot)src/sz.c \
|
$(srcroot)src/sz.c \
|
||||||
|
@ -178,6 +180,7 @@ TESTS_UNIT := \
|
||||||
$(srcroot)test/unit/div.c \
|
$(srcroot)test/unit/div.c \
|
||||||
$(srcroot)test/unit/emitter.c \
|
$(srcroot)test/unit/emitter.c \
|
||||||
$(srcroot)test/unit/extent_quantize.c \
|
$(srcroot)test/unit/extent_quantize.c \
|
||||||
|
$(srcroot)test/unit/extent_util.c \
|
||||||
$(srcroot)test/unit/fork.c \
|
$(srcroot)test/unit/fork.c \
|
||||||
$(srcroot)test/unit/hash.c \
|
$(srcroot)test/unit/hash.c \
|
||||||
$(srcroot)test/unit/hook.c \
|
$(srcroot)test/unit/hook.c \
|
||||||
|
@ -208,6 +211,7 @@ TESTS_UNIT := \
|
||||||
$(srcroot)test/unit/rb.c \
|
$(srcroot)test/unit/rb.c \
|
||||||
$(srcroot)test/unit/retained.c \
|
$(srcroot)test/unit/retained.c \
|
||||||
$(srcroot)test/unit/rtree.c \
|
$(srcroot)test/unit/rtree.c \
|
||||||
|
$(srcroot)test/unit/safety_check.c \
|
||||||
$(srcroot)test/unit/seq.c \
|
$(srcroot)test/unit/seq.c \
|
||||||
$(srcroot)test/unit/SFMT.c \
|
$(srcroot)test/unit/SFMT.c \
|
||||||
$(srcroot)test/unit/sc.c \
|
$(srcroot)test/unit/sc.c \
|
||||||
|
@ -513,7 +517,11 @@ done
|
||||||
|
|
||||||
install_doc: build_doc install_doc_html install_doc_man
|
install_doc: build_doc install_doc_html install_doc_man
|
||||||
|
|
||||||
install: install_bin install_include install_lib install_doc
|
install: install_bin install_include install_lib
|
||||||
|
|
||||||
|
ifeq ($(enable_doc), 1)
|
||||||
|
install: install_doc
|
||||||
|
endif
|
||||||
|
|
||||||
tests_unit: $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%$(EXE))
|
tests_unit: $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%$(EXE))
|
||||||
tests_integration: $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%$(EXE)) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%$(EXE))
|
tests_integration: $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%$(EXE)) $(TESTS_INTEGRATION_CPP:$(srcroot)%.cpp=$(objroot)%$(EXE))
|
|
@ -2909,6 +2909,7 @@ sub RemoveUninterestingFrames {
|
||||||
'@JEMALLOC_PREFIX@xallocx',
|
'@JEMALLOC_PREFIX@xallocx',
|
||||||
'@JEMALLOC_PREFIX@dallocx',
|
'@JEMALLOC_PREFIX@dallocx',
|
||||||
'@JEMALLOC_PREFIX@sdallocx',
|
'@JEMALLOC_PREFIX@sdallocx',
|
||||||
|
'@JEMALLOC_PREFIX@sdallocx_noflags',
|
||||||
'tc_calloc',
|
'tc_calloc',
|
||||||
'tc_cfree',
|
'tc_cfree',
|
||||||
'tc_malloc',
|
'tc_malloc',
|
||||||
|
@ -5366,7 +5367,7 @@ sub GetProcedureBoundaries {
|
||||||
my $demangle_flag = "";
|
my $demangle_flag = "";
|
||||||
my $cppfilt_flag = "";
|
my $cppfilt_flag = "";
|
||||||
my $to_devnull = ">$dev_null 2>&1";
|
my $to_devnull = ">$dev_null 2>&1";
|
||||||
if (system(ShellEscape($nm, "--demangle", "image") . $to_devnull) == 0) {
|
if (system(ShellEscape($nm, "--demangle", $image) . $to_devnull) == 0) {
|
||||||
# In this mode, we do "nm --demangle <foo>"
|
# In this mode, we do "nm --demangle <foo>"
|
||||||
$demangle_flag = "--demangle";
|
$demangle_flag = "--demangle";
|
||||||
$cppfilt_flag = "";
|
$cppfilt_flag = "";
|
|
@ -630,7 +630,7 @@ enable_zone_allocator
|
||||||
enable_tls
|
enable_tls
|
||||||
enable_lazy_lock
|
enable_lazy_lock
|
||||||
libdl
|
libdl
|
||||||
enable_extra_size_check
|
enable_opt_safety_checks
|
||||||
enable_readlinkat
|
enable_readlinkat
|
||||||
enable_log
|
enable_log
|
||||||
enable_cache_oblivious
|
enable_cache_oblivious
|
||||||
|
@ -648,6 +648,7 @@ JEMALLOC_CPREFIX
|
||||||
JEMALLOC_PREFIX
|
JEMALLOC_PREFIX
|
||||||
enable_static
|
enable_static
|
||||||
enable_shared
|
enable_shared
|
||||||
|
enable_doc
|
||||||
AUTOCONF
|
AUTOCONF
|
||||||
LD
|
LD
|
||||||
RANLIB
|
RANLIB
|
||||||
|
@ -779,6 +780,7 @@ with_lg_vaddr
|
||||||
with_version
|
with_version
|
||||||
with_rpath
|
with_rpath
|
||||||
enable_autogen
|
enable_autogen
|
||||||
|
enable_doc
|
||||||
enable_shared
|
enable_shared
|
||||||
enable_static
|
enable_static
|
||||||
with_mangling
|
with_mangling
|
||||||
|
@ -801,7 +803,7 @@ enable_xmalloc
|
||||||
enable_cache_oblivious
|
enable_cache_oblivious
|
||||||
enable_log
|
enable_log
|
||||||
enable_readlinkat
|
enable_readlinkat
|
||||||
enable_extra_size_check
|
enable_opt_safety_checks
|
||||||
with_lg_quantum
|
with_lg_quantum
|
||||||
with_lg_page
|
with_lg_page
|
||||||
with_lg_hugepage
|
with_lg_hugepage
|
||||||
|
@ -1447,6 +1449,7 @@ Optional Features:
|
||||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||||
--disable-cxx Disable C++ integration
|
--disable-cxx Disable C++ integration
|
||||||
--enable-autogen Automatically regenerate configure output
|
--enable-autogen Automatically regenerate configure output
|
||||||
|
--enable-documentation Build documentation
|
||||||
--enable-shared Build shared libaries
|
--enable-shared Build shared libaries
|
||||||
--enable-static Build static libaries
|
--enable-static Build static libaries
|
||||||
--enable-debug Build debugging code
|
--enable-debug Build debugging code
|
||||||
|
@ -1465,8 +1468,9 @@ Optional Features:
|
||||||
alignment
|
alignment
|
||||||
--enable-log Support debug logging
|
--enable-log Support debug logging
|
||||||
--enable-readlinkat Use readlinkat over readlink
|
--enable-readlinkat Use readlinkat over readlink
|
||||||
--enable-extra-size-check
|
--enable-opt-safety-checks
|
||||||
Perform additonal size related sanity checks
|
Perform certain low-overhead checks, even in opt
|
||||||
|
mode
|
||||||
--disable-libdl Do not use libdl
|
--disable-libdl Do not use libdl
|
||||||
--disable-syscall Disable use of syscall(2)
|
--disable-syscall Disable use of syscall(2)
|
||||||
--enable-lazy-lock Enable lazy locking (only lock when multi-threaded)
|
--enable-lazy-lock Enable lazy locking (only lock when multi-threaded)
|
||||||
|
@ -7730,6 +7734,9 @@ fi
|
||||||
libprefix=""
|
libprefix=""
|
||||||
SOREV="${so}"
|
SOREV="${so}"
|
||||||
PIC_CFLAGS=""
|
PIC_CFLAGS=""
|
||||||
|
if test "${LG_SIZEOF_PTR}" = "3"; then
|
||||||
|
default_retain="1"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Unsupported operating system: ${host}" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Unsupported operating system: ${host}" >&5
|
||||||
|
@ -8597,6 +8604,151 @@ if test "x${je_cv_format_printf}" = "xyes" ; then
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
SAVED_CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS}"
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -Werror" >&5
|
||||||
|
$as_echo_n "checking whether compiler supports -Werror... " >&6; }
|
||||||
|
T_CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS}"
|
||||||
|
T_APPEND_V=-Werror
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${T_APPEND_V}" = "x" ; then
|
||||||
|
CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS}${T_APPEND_V}"
|
||||||
|
else
|
||||||
|
CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS} ${T_APPEND_V}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${SPECIFIED_CFLAGS}" = "x" ; then
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS}${SPECIFIED_CFLAGS}"
|
||||||
|
else
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS} ${SPECIFIED_CFLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
je_cv_cflags_added=-Werror
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
else
|
||||||
|
je_cv_cflags_added=
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
CONFIGURE_CFLAGS="${T_CONFIGURE_CFLAGS}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${SPECIFIED_CFLAGS}" = "x" ; then
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS}${SPECIFIED_CFLAGS}"
|
||||||
|
else
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS} ${SPECIFIED_CFLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compiler supports -herror_on_warning" >&5
|
||||||
|
$as_echo_n "checking whether compiler supports -herror_on_warning... " >&6; }
|
||||||
|
T_CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS}"
|
||||||
|
T_APPEND_V=-herror_on_warning
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${T_APPEND_V}" = "x" ; then
|
||||||
|
CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS}${T_APPEND_V}"
|
||||||
|
else
|
||||||
|
CONFIGURE_CFLAGS="${CONFIGURE_CFLAGS} ${T_APPEND_V}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${SPECIFIED_CFLAGS}" = "x" ; then
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS}${SPECIFIED_CFLAGS}"
|
||||||
|
else
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS} ${SPECIFIED_CFLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_compile "$LINENO"; then :
|
||||||
|
je_cv_cflags_added=-herror_on_warning
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||||
|
$as_echo "yes" >&6; }
|
||||||
|
else
|
||||||
|
je_cv_cflags_added=
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
CONFIGURE_CFLAGS="${T_CONFIGURE_CFLAGS}"
|
||||||
|
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${SPECIFIED_CFLAGS}" = "x" ; then
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS}${SPECIFIED_CFLAGS}"
|
||||||
|
else
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS} ${SPECIFIED_CFLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether format(printf, ...) attribute is compilable" >&5
|
||||||
|
$as_echo_n "checking whether format(printf, ...) attribute is compilable... " >&6; }
|
||||||
|
if ${je_cv_format_arg+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
const char * __attribute__((__format_arg__(1))) foo(const char *format);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
je_cv_format_arg=yes
|
||||||
|
else
|
||||||
|
je_cv_format_arg=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $je_cv_format_arg" >&5
|
||||||
|
$as_echo "$je_cv_format_arg" >&6; }
|
||||||
|
|
||||||
|
CONFIGURE_CFLAGS="${SAVED_CONFIGURE_CFLAGS}"
|
||||||
|
if test "x${CONFIGURE_CFLAGS}" = "x" -o "x${SPECIFIED_CFLAGS}" = "x" ; then
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS}${SPECIFIED_CFLAGS}"
|
||||||
|
else
|
||||||
|
CFLAGS="${CONFIGURE_CFLAGS} ${SPECIFIED_CFLAGS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x${je_cv_format_arg}" = "xyes" ; then
|
||||||
|
$as_echo "#define JEMALLOC_HAVE_ATTR_FORMAT_ARG " >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-rpath was given.
|
# Check whether --with-rpath was given.
|
||||||
if test "${with_rpath+set}" = set; then :
|
if test "${with_rpath+set}" = set; then :
|
||||||
|
@ -8895,6 +9047,21 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --enable-doc was given.
|
||||||
|
if test "${enable_doc+set}" = set; then :
|
||||||
|
enableval=$enable_doc; if test "x$enable_doc" = "xno" ; then
|
||||||
|
enable_doc="0"
|
||||||
|
else
|
||||||
|
enable_doc="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
enable_doc="1"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --enable-shared was given.
|
# Check whether --enable-shared was given.
|
||||||
if test "${enable_shared+set}" = set; then :
|
if test "${enable_shared+set}" = set; then :
|
||||||
enableval=$enable_shared; if test "x$enable_shared" = "xno" ; then
|
enableval=$enable_shared; if test "x$enable_shared" = "xno" ; then
|
||||||
|
@ -10130,21 +10297,21 @@ if test "x$enable_readlinkat" = "x1" ; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Check whether --enable-extra-size-check was given.
|
# Check whether --enable-opt-safety-checks was given.
|
||||||
if test "${enable_extra_size_check+set}" = set; then :
|
if test "${enable_opt_safety_checks+set}" = set; then :
|
||||||
enableval=$enable_extra_size_check; if test "x$enable_extra_size_check" = "xno" ; then
|
enableval=$enable_opt_safety_checks; if test "x$enable_opt_safety_checks" = "xno" ; then
|
||||||
enable_extra_size_check="0"
|
enable_opt_safety_checks="0"
|
||||||
else
|
else
|
||||||
enable_extra_size_check="1"
|
enable_opt_safety_checks="1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
else
|
else
|
||||||
enable_extra_size_check="0"
|
enable_opt_safety_checks="0"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$enable_extra_size_check" = "x1" ; then
|
if test "x$enable_opt_safety_checks" = "x1" ; then
|
||||||
$as_echo "#define JEMALLOC_EXTRA_SIZE_CHECK " >>confdefs.h
|
$as_echo "#define JEMALLOC_OPT_SAFETY_CHECKS " >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -13905,6 +14072,8 @@ $as_echo " : ${JEMALLOC_PRIVATE_NAMESPACE}" >&6; }
|
||||||
$as_echo "install_suffix : ${install_suffix}" >&6; }
|
$as_echo "install_suffix : ${install_suffix}" >&6; }
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: malloc_conf : ${config_malloc_conf}" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: malloc_conf : ${config_malloc_conf}" >&5
|
||||||
$as_echo "malloc_conf : ${config_malloc_conf}" >&6; }
|
$as_echo "malloc_conf : ${config_malloc_conf}" >&6; }
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: documentation : ${enable_doc}" >&5
|
||||||
|
$as_echo "documentation : ${enable_doc}" >&6; }
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: shared libs : ${enable_shared}" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: shared libs : ${enable_shared}" >&5
|
||||||
$as_echo "shared libs : ${enable_shared}" >&6; }
|
$as_echo "shared libs : ${enable_shared}" >&6; }
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: static libs : ${enable_static}" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: static libs : ${enable_static}" >&5
|
|
@ -738,6 +738,9 @@ case "${host}" in
|
||||||
libprefix=""
|
libprefix=""
|
||||||
SOREV="${so}"
|
SOREV="${so}"
|
||||||
PIC_CFLAGS=""
|
PIC_CFLAGS=""
|
||||||
|
if test "${LG_SIZEOF_PTR}" = "3"; then
|
||||||
|
default_retain="1"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
AC_MSG_RESULT([Unsupported operating system: ${host}])
|
AC_MSG_RESULT([Unsupported operating system: ${host}])
|
||||||
|
@ -851,6 +854,18 @@ if test "x${je_cv_format_printf}" = "xyes" ; then
|
||||||
AC_DEFINE([JEMALLOC_HAVE_ATTR_FORMAT_PRINTF], [ ])
|
AC_DEFINE([JEMALLOC_HAVE_ATTR_FORMAT_PRINTF], [ ])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl Check for format_arg(...) attribute support.
|
||||||
|
JE_CFLAGS_SAVE()
|
||||||
|
JE_CFLAGS_ADD([-Werror])
|
||||||
|
JE_CFLAGS_ADD([-herror_on_warning])
|
||||||
|
JE_COMPILABLE([format(printf, ...) attribute], [#include <stdlib.h>],
|
||||||
|
[const char * __attribute__((__format_arg__(1))) foo(const char *format);],
|
||||||
|
[je_cv_format_arg])
|
||||||
|
JE_CFLAGS_RESTORE()
|
||||||
|
if test "x${je_cv_format_arg}" = "xyes" ; then
|
||||||
|
AC_DEFINE([JEMALLOC_HAVE_ATTR_FORMAT_ARG], [ ])
|
||||||
|
fi
|
||||||
|
|
||||||
dnl Support optional additions to rpath.
|
dnl Support optional additions to rpath.
|
||||||
AC_ARG_WITH([rpath],
|
AC_ARG_WITH([rpath],
|
||||||
[AS_HELP_STRING([--with-rpath=<rpath>], [Colon-separated rpath (ELF systems only)])],
|
[AS_HELP_STRING([--with-rpath=<rpath>], [Colon-separated rpath (ELF systems only)])],
|
||||||
|
@ -881,6 +896,19 @@ AC_PROG_RANLIB
|
||||||
AC_PATH_PROG([LD], [ld], [false], [$PATH])
|
AC_PATH_PROG([LD], [ld], [false], [$PATH])
|
||||||
AC_PATH_PROG([AUTOCONF], [autoconf], [false], [$PATH])
|
AC_PATH_PROG([AUTOCONF], [autoconf], [false], [$PATH])
|
||||||
|
|
||||||
|
dnl Enable documentation
|
||||||
|
AC_ARG_ENABLE([doc],
|
||||||
|
[AS_HELP_STRING([--enable-documentation], [Build documentation])],
|
||||||
|
if test "x$enable_doc" = "xno" ; then
|
||||||
|
enable_doc="0"
|
||||||
|
else
|
||||||
|
enable_doc="1"
|
||||||
|
fi
|
||||||
|
,
|
||||||
|
enable_doc="1"
|
||||||
|
)
|
||||||
|
AC_SUBST([enable_doc])
|
||||||
|
|
||||||
dnl Enable shared libs
|
dnl Enable shared libs
|
||||||
AC_ARG_ENABLE([shared],
|
AC_ARG_ENABLE([shared],
|
||||||
[AS_HELP_STRING([--enable-shared], [Build shared libaries])],
|
[AS_HELP_STRING([--enable-shared], [Build shared libaries])],
|
||||||
|
@ -1406,22 +1434,22 @@ if test "x$enable_readlinkat" = "x1" ; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST([enable_readlinkat])
|
AC_SUBST([enable_readlinkat])
|
||||||
|
|
||||||
dnl Avoid the extra size checking by default
|
dnl Avoid extra safety checks by default
|
||||||
AC_ARG_ENABLE([extra-size-check],
|
AC_ARG_ENABLE([opt-safety-checks],
|
||||||
[AS_HELP_STRING([--enable-extra-size-check],
|
[AS_HELP_STRING([--enable-opt-safety-checks],
|
||||||
[Perform additonal size related sanity checks])],
|
[Perform certain low-overhead checks, even in opt mode])],
|
||||||
[if test "x$enable_extra_size_check" = "xno" ; then
|
[if test "x$enable_opt_safety_checks" = "xno" ; then
|
||||||
enable_extra_size_check="0"
|
enable_opt_safety_checks="0"
|
||||||
else
|
else
|
||||||
enable_extra_size_check="1"
|
enable_opt_safety_checks="1"
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[enable_extra_size_check="0"]
|
[enable_opt_safety_checks="0"]
|
||||||
)
|
)
|
||||||
if test "x$enable_extra_size_check" = "x1" ; then
|
if test "x$enable_opt_safety_checks" = "x1" ; then
|
||||||
AC_DEFINE([JEMALLOC_EXTRA_SIZE_CHECK], [ ])
|
AC_DEFINE([JEMALLOC_OPT_SAFETY_CHECKS], [ ])
|
||||||
fi
|
fi
|
||||||
AC_SUBST([enable_extra_size_check])
|
AC_SUBST([enable_opt_safety_checks])
|
||||||
|
|
||||||
JE_COMPILABLE([a program using __builtin_unreachable], [
|
JE_COMPILABLE([a program using __builtin_unreachable], [
|
||||||
void foo (void) {
|
void foo (void) {
|
||||||
|
@ -2357,6 +2385,7 @@ AC_MSG_RESULT([JEMALLOC_PRIVATE_NAMESPACE])
|
||||||
AC_MSG_RESULT([ : ${JEMALLOC_PRIVATE_NAMESPACE}])
|
AC_MSG_RESULT([ : ${JEMALLOC_PRIVATE_NAMESPACE}])
|
||||||
AC_MSG_RESULT([install_suffix : ${install_suffix}])
|
AC_MSG_RESULT([install_suffix : ${install_suffix}])
|
||||||
AC_MSG_RESULT([malloc_conf : ${config_malloc_conf}])
|
AC_MSG_RESULT([malloc_conf : ${config_malloc_conf}])
|
||||||
|
AC_MSG_RESULT([documentation : ${enable_doc}])
|
||||||
AC_MSG_RESULT([shared libs : ${enable_shared}])
|
AC_MSG_RESULT([shared libs : ${enable_shared}])
|
||||||
AC_MSG_RESULT([static libs : ${enable_static}])
|
AC_MSG_RESULT([static libs : ${enable_static}])
|
||||||
AC_MSG_RESULT([autogen : ${enable_autogen}])
|
AC_MSG_RESULT([autogen : ${enable_autogen}])
|
|
@ -424,7 +424,7 @@ for (i = 0; i < nbins; i++) {
|
||||||
called repeatedly. General information that never changes during
|
called repeatedly. General information that never changes during
|
||||||
execution can be omitted by specifying <quote>g</quote> as a character
|
execution can be omitted by specifying <quote>g</quote> as a character
|
||||||
within the <parameter>opts</parameter> string. Note that
|
within the <parameter>opts</parameter> string. Note that
|
||||||
<function>malloc_message()</function> uses the
|
<function>malloc_stats_print()</function> uses the
|
||||||
<function>mallctl*()</function> functions internally, so inconsistent
|
<function>mallctl*()</function> functions internally, so inconsistent
|
||||||
statistics can be reported if multiple threads use these functions
|
statistics can be reported if multiple threads use these functions
|
||||||
simultaneously. If <option>--enable-stats</option> is specified during
|
simultaneously. If <option>--enable-stats</option> is specified during
|
||||||
|
@ -904,6 +904,23 @@ mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".decay",
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="opt.confirm_conf">
|
||||||
|
<term>
|
||||||
|
<mallctl>opt.confirm_conf</mallctl>
|
||||||
|
(<type>bool</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
</term>
|
||||||
|
<listitem><para>Confirm-runtime-options-when-program-starts
|
||||||
|
enabled/disabled. If true, the string specified via
|
||||||
|
<option>--with-malloc-conf</option>, the string pointed to by the
|
||||||
|
global variable <varname>malloc_conf</varname>, the <quote>name</quote>
|
||||||
|
of the file referenced by the symbolic link named
|
||||||
|
<filename class="symlink">/etc/malloc.conf</filename>, and the value of
|
||||||
|
the environment variable <envar>MALLOC_CONF</envar>, will be printed in
|
||||||
|
order. Then, each option being set will be individually printed. This
|
||||||
|
option is disabled by default.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="opt.abort_conf">
|
<varlistentry id="opt.abort_conf">
|
||||||
<term>
|
<term>
|
||||||
<mallctl>opt.abort_conf</mallctl>
|
<mallctl>opt.abort_conf</mallctl>
|
||||||
|
@ -946,17 +963,17 @@ mallctl("arena." STRINGIFY(MALLCTL_ARENAS_ALL) ".decay",
|
||||||
linkend="stats.retained">stats.retained</link> for related details).
|
linkend="stats.retained">stats.retained</link> for related details).
|
||||||
It also makes jemalloc use <citerefentry>
|
It also makes jemalloc use <citerefentry>
|
||||||
<refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum>
|
<refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum>
|
||||||
</citerefentry> in a more greedy way, mapping larger chunks in one go.
|
</citerefentry> or equivalent in a more greedy way, mapping larger
|
||||||
This option is disabled by default unless discarding virtual memory is
|
chunks in one go. This option is disabled by default unless discarding
|
||||||
known to trigger
|
virtual memory is known to trigger platform-specific performance
|
||||||
platform-specific performance problems, e.g. for [64-bit] Linux, which
|
problems, namely 1) for [64-bit] Linux, which has a quirk in its virtual
|
||||||
has a quirk in its virtual memory allocation algorithm that causes
|
memory allocation algorithm that causes semi-permanent VM map holes
|
||||||
semi-permanent VM map holes under normal jemalloc operation. Although
|
under normal jemalloc operation; and 2) for [64-bit] Windows, which
|
||||||
<citerefentry><refentrytitle>munmap</refentrytitle>
|
disallows split / merged regions with
|
||||||
<manvolnum>2</manvolnum></citerefentry> causes issues on 32-bit Linux as
|
<parameter><constant>MEM_RELEASE</constant></parameter>. Although the
|
||||||
well, retaining virtual memory for 32-bit Linux is disabled by default
|
same issues may present on 32-bit platforms as well, retaining virtual
|
||||||
due to the practical possibility of address space exhaustion.
|
memory for 32-bit Linux and Windows is disabled by default due to the
|
||||||
</para></listitem>
|
practical possibility of address space exhaustion. </para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="opt.dss">
|
<varlistentry id="opt.dss">
|
||||||
|
@ -2798,6 +2815,28 @@ struct extent_hooks_s {
|
||||||
all bin size classes.</para></listitem>
|
all bin size classes.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.small.nfills">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.small.nfills</mallctl>
|
||||||
|
(<type>uint64_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Cumulative number of tcache fills by all small size
|
||||||
|
classes.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.small.nflushes">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.small.nflushes</mallctl>
|
||||||
|
(<type>uint64_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Cumulative number of tcache flushes by all small size
|
||||||
|
classes.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="stats.arenas.i.large.allocated">
|
<varlistentry id="stats.arenas.i.large.allocated">
|
||||||
<term>
|
<term>
|
||||||
<mallctl>stats.arenas.<i>.large.allocated</mallctl>
|
<mallctl>stats.arenas.<i>.large.allocated</mallctl>
|
||||||
|
@ -2848,6 +2887,28 @@ struct extent_hooks_s {
|
||||||
all large size classes.</para></listitem>
|
all large size classes.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.large.nfills">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.large.nfills</mallctl>
|
||||||
|
(<type>uint64_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Cumulative number of tcache fills by all large size
|
||||||
|
classes.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.large.nflushes">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.large.nflushes</mallctl>
|
||||||
|
(<type>uint64_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Cumulative number of tcache flushes by all large size
|
||||||
|
classes.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="stats.arenas.i.bins.j.nmalloc">
|
<varlistentry id="stats.arenas.i.bins.j.nmalloc">
|
||||||
<term>
|
<term>
|
||||||
<mallctl>stats.arenas.<i>.bins.<j>.nmalloc</mallctl>
|
<mallctl>stats.arenas.<i>.bins.<j>.nmalloc</mallctl>
|
||||||
|
@ -2947,6 +3008,17 @@ struct extent_hooks_s {
|
||||||
<listitem><para>Current number of slabs.</para></listitem>
|
<listitem><para>Current number of slabs.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry id="stats.arenas.i.bins.j.nonfull_slabs">
|
||||||
|
<term>
|
||||||
|
<mallctl>stats.arenas.<i>.bins.<j>.nonfull_slabs</mallctl>
|
||||||
|
(<type>size_t</type>)
|
||||||
|
<literal>r-</literal>
|
||||||
|
[<option>--enable-stats</option>]
|
||||||
|
</term>
|
||||||
|
<listitem><para>Current number of nonfull slabs.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry id="stats.arenas.i.bins.mutex">
|
<varlistentry id="stats.arenas.i.bins.mutex">
|
||||||
<term>
|
<term>
|
||||||
<mallctl>stats.arenas.<i>.bins.<j>.mutex.{counter}</mallctl>
|
<mallctl>stats.arenas.<i>.bins.<j>.mutex.{counter}</mallctl>
|
|
@ -60,7 +60,7 @@ void *arena_malloc_hard(tsdn_t *tsdn, arena_t *arena, size_t size,
|
||||||
szind_t ind, bool zero);
|
szind_t ind, bool zero);
|
||||||
void *arena_palloc(tsdn_t *tsdn, arena_t *arena, size_t usize,
|
void *arena_palloc(tsdn_t *tsdn, arena_t *arena, size_t usize,
|
||||||
size_t alignment, bool zero, tcache_t *tcache);
|
size_t alignment, bool zero, tcache_t *tcache);
|
||||||
void arena_prof_promote(tsdn_t *tsdn, const void *ptr, size_t usize);
|
void arena_prof_promote(tsdn_t *tsdn, void *ptr, size_t usize);
|
||||||
void arena_dalloc_promoted(tsdn_t *tsdn, void *ptr, tcache_t *tcache,
|
void arena_dalloc_promoted(tsdn_t *tsdn, void *ptr, tcache_t *tcache,
|
||||||
bool slow_path);
|
bool slow_path);
|
||||||
void arena_dalloc_bin_junked_locked(tsdn_t *tsdn, arena_t *arena, bin_t *bin,
|
void arena_dalloc_bin_junked_locked(tsdn_t *tsdn, arena_t *arena, bin_t *bin,
|
|
@ -90,7 +90,7 @@ arena_prof_alloc_time_get(tsdn_t *tsdn, const void *ptr,
|
||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
|
|
||||||
extent_t *extent = iealloc(tsdn, ptr);
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
/*
|
/*
|
||||||
* Unlike arena_prof_prof_tctx_{get, set}, we only call this once we're
|
* Unlike arena_prof_prof_tctx_{get, set}, we only call this once we're
|
||||||
* sure we have a sampled allocation.
|
* sure we have a sampled allocation.
|
||||||
*/
|
*/
|
||||||
|
@ -228,6 +228,16 @@ arena_vsalloc(tsdn_t *tsdn, const void *ptr) {
|
||||||
return sz_index2size(szind);
|
return sz_index2size(szind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
arena_dalloc_large_no_tcache(tsdn_t *tsdn, void *ptr, szind_t szind) {
|
||||||
|
if (config_prof && unlikely(szind < SC_NBINS)) {
|
||||||
|
arena_dalloc_promoted(tsdn, ptr, NULL, true);
|
||||||
|
} else {
|
||||||
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
|
large_dalloc(tsdn, extent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
arena_dalloc_no_tcache(tsdn_t *tsdn, void *ptr) {
|
arena_dalloc_no_tcache(tsdn_t *tsdn, void *ptr) {
|
||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
|
@ -251,6 +261,21 @@ arena_dalloc_no_tcache(tsdn_t *tsdn, void *ptr) {
|
||||||
if (likely(slab)) {
|
if (likely(slab)) {
|
||||||
/* Small allocation. */
|
/* Small allocation. */
|
||||||
arena_dalloc_small(tsdn, ptr);
|
arena_dalloc_small(tsdn, ptr);
|
||||||
|
} else {
|
||||||
|
arena_dalloc_large_no_tcache(tsdn, ptr, szind);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
|
arena_dalloc_large(tsdn_t *tsdn, void *ptr, tcache_t *tcache, szind_t szind,
|
||||||
|
bool slow_path) {
|
||||||
|
if (szind < nhbins) {
|
||||||
|
if (config_prof && unlikely(szind < SC_NBINS)) {
|
||||||
|
arena_dalloc_promoted(tsdn, ptr, tcache, slow_path);
|
||||||
|
} else {
|
||||||
|
tcache_dalloc_large(tsdn_tsd(tsdn), tcache, ptr, szind,
|
||||||
|
slow_path);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
extent_t *extent = iealloc(tsdn, ptr);
|
extent_t *extent = iealloc(tsdn, ptr);
|
||||||
large_dalloc(tsdn, extent);
|
large_dalloc(tsdn, extent);
|
||||||
|
@ -295,18 +320,7 @@ arena_dalloc(tsdn_t *tsdn, void *ptr, tcache_t *tcache,
|
||||||
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
||||||
slow_path);
|
slow_path);
|
||||||
} else {
|
} else {
|
||||||
if (szind < nhbins) {
|
arena_dalloc_large(tsdn, ptr, tcache, szind, slow_path);
|
||||||
if (config_prof && unlikely(szind < SC_NBINS)) {
|
|
||||||
arena_dalloc_promoted(tsdn, ptr, tcache,
|
|
||||||
slow_path);
|
|
||||||
} else {
|
|
||||||
tcache_dalloc_large(tsdn_tsd(tsdn), tcache, ptr,
|
|
||||||
szind, slow_path);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
extent_t *extent = iealloc(tsdn, ptr);
|
|
||||||
large_dalloc(tsdn, extent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,8 +363,7 @@ arena_sdalloc_no_tcache(tsdn_t *tsdn, void *ptr, size_t size) {
|
||||||
/* Small allocation. */
|
/* Small allocation. */
|
||||||
arena_dalloc_small(tsdn, ptr);
|
arena_dalloc_small(tsdn, ptr);
|
||||||
} else {
|
} else {
|
||||||
extent_t *extent = iealloc(tsdn, ptr);
|
arena_dalloc_large_no_tcache(tsdn, ptr, szind);
|
||||||
large_dalloc(tsdn, extent);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,18 +420,7 @@ arena_sdalloc(tsdn_t *tsdn, void *ptr, size_t size, tcache_t *tcache,
|
||||||
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
tcache_dalloc_small(tsdn_tsd(tsdn), tcache, ptr, szind,
|
||||||
slow_path);
|
slow_path);
|
||||||
} else {
|
} else {
|
||||||
if (szind < nhbins) {
|
arena_dalloc_large(tsdn, ptr, tcache, szind, slow_path);
|
||||||
if (config_prof && unlikely(szind < SC_NBINS)) {
|
|
||||||
arena_dalloc_promoted(tsdn, ptr, tcache,
|
|
||||||
slow_path);
|
|
||||||
} else {
|
|
||||||
tcache_dalloc_large(tsdn_tsd(tsdn),
|
|
||||||
tcache, ptr, szind, slow_path);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
extent_t *extent = iealloc(tsdn, ptr);
|
|
||||||
large_dalloc(tsdn, extent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,13 @@ struct arena_stats_large_s {
|
||||||
* periodically merges into this counter.
|
* periodically merges into this counter.
|
||||||
*/
|
*/
|
||||||
arena_stats_u64_t nrequests; /* Partially derived. */
|
arena_stats_u64_t nrequests; /* Partially derived. */
|
||||||
|
/*
|
||||||
|
* Number of tcache fills / flushes for large (similarly, periodically
|
||||||
|
* merged). Note that there is no large tcache batch-fill currently
|
||||||
|
* (i.e. only fill 1 at a time); however flush may be batched.
|
||||||
|
*/
|
||||||
|
arena_stats_u64_t nfills; /* Partially derived. */
|
||||||
|
arena_stats_u64_t nflushes; /* Partially derived. */
|
||||||
|
|
||||||
/* Current number of allocations of this size class. */
|
/* Current number of allocations of this size class. */
|
||||||
size_t curlextents; /* Derived. */
|
size_t curlextents; /* Derived. */
|
||||||
|
@ -101,8 +108,13 @@ struct arena_stats_s {
|
||||||
atomic_zu_t allocated_large; /* Derived. */
|
atomic_zu_t allocated_large; /* Derived. */
|
||||||
arena_stats_u64_t nmalloc_large; /* Derived. */
|
arena_stats_u64_t nmalloc_large; /* Derived. */
|
||||||
arena_stats_u64_t ndalloc_large; /* Derived. */
|
arena_stats_u64_t ndalloc_large; /* Derived. */
|
||||||
|
arena_stats_u64_t nfills_large; /* Derived. */
|
||||||
|
arena_stats_u64_t nflushes_large; /* Derived. */
|
||||||
arena_stats_u64_t nrequests_large; /* Derived. */
|
arena_stats_u64_t nrequests_large; /* Derived. */
|
||||||
|
|
||||||
|
/* VM space had to be leaked (undocumented). Normally 0. */
|
||||||
|
atomic_zu_t abandoned_vm;
|
||||||
|
|
||||||
/* Number of bytes cached in tcache associated with this arena. */
|
/* Number of bytes cached in tcache associated with this arena. */
|
||||||
atomic_zu_t tcache_bytes; /* Derived. */
|
atomic_zu_t tcache_bytes; /* Derived. */
|
||||||
|
|
||||||
|
@ -240,11 +252,12 @@ arena_stats_accum_zu(atomic_zu_t *dst, size_t src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
arena_stats_large_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats,
|
arena_stats_large_flush_nrequests_add(tsdn_t *tsdn, arena_stats_t *arena_stats,
|
||||||
szind_t szind, uint64_t nrequests) {
|
szind_t szind, uint64_t nrequests) {
|
||||||
arena_stats_lock(tsdn, arena_stats);
|
arena_stats_lock(tsdn, arena_stats);
|
||||||
arena_stats_add_u64(tsdn, arena_stats, &arena_stats->lstats[szind -
|
arena_stats_large_t *lstats = &arena_stats->lstats[szind - SC_NBINS];
|
||||||
SC_NBINS].nrequests, nrequests);
|
arena_stats_add_u64(tsdn, arena_stats, &lstats->nrequests, nrequests);
|
||||||
|
arena_stats_add_u64(tsdn, arena_stats, &lstats->nflushes, 1);
|
||||||
arena_stats_unlock(tsdn, arena_stats);
|
arena_stats_unlock(tsdn, arena_stats);
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,7 +116,6 @@ struct arena_s {
|
||||||
|
|
||||||
/* Synchronization: internal. */
|
/* Synchronization: internal. */
|
||||||
prof_accum_t prof_accum;
|
prof_accum_t prof_accum;
|
||||||
uint64_t prof_accumbytes;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PRNG state for cache index randomization of large allocation base
|
* PRNG state for cache index randomization of large allocation base
|
|
@ -67,7 +67,8 @@ atomic_exchange_##short_type(atomic_##short_type##_t *a, type val, \
|
||||||
\
|
\
|
||||||
ATOMIC_INLINE bool \
|
ATOMIC_INLINE bool \
|
||||||
atomic_compare_exchange_weak_##short_type(atomic_##short_type##_t *a, \
|
atomic_compare_exchange_weak_##short_type(atomic_##short_type##_t *a, \
|
||||||
type *expected, type desired, atomic_memory_order_t success_mo, \
|
UNUSED type *expected, type desired, \
|
||||||
|
atomic_memory_order_t success_mo, \
|
||||||
atomic_memory_order_t failure_mo) { \
|
atomic_memory_order_t failure_mo) { \
|
||||||
return __atomic_compare_exchange(&a->repr, expected, &desired, \
|
return __atomic_compare_exchange(&a->repr, expected, &desired, \
|
||||||
true, atomic_enum_to_builtin(success_mo), \
|
true, atomic_enum_to_builtin(success_mo), \
|
||||||
|
@ -76,7 +77,8 @@ atomic_compare_exchange_weak_##short_type(atomic_##short_type##_t *a, \
|
||||||
\
|
\
|
||||||
ATOMIC_INLINE bool \
|
ATOMIC_INLINE bool \
|
||||||
atomic_compare_exchange_strong_##short_type(atomic_##short_type##_t *a, \
|
atomic_compare_exchange_strong_##short_type(atomic_##short_type##_t *a, \
|
||||||
type *expected, type desired, atomic_memory_order_t success_mo, \
|
UNUSED type *expected, type desired, \
|
||||||
|
atomic_memory_order_t success_mo, \
|
||||||
atomic_memory_order_t failure_mo) { \
|
atomic_memory_order_t failure_mo) { \
|
||||||
return __atomic_compare_exchange(&a->repr, expected, &desired, \
|
return __atomic_compare_exchange(&a->repr, expected, &desired, \
|
||||||
false, \
|
false, \
|
|
@ -116,6 +116,7 @@ bin_stats_merge(tsdn_t *tsdn, bin_stats_t *dst_bin_stats, bin_t *bin) {
|
||||||
dst_bin_stats->nslabs += bin->stats.nslabs;
|
dst_bin_stats->nslabs += bin->stats.nslabs;
|
||||||
dst_bin_stats->reslabs += bin->stats.reslabs;
|
dst_bin_stats->reslabs += bin->stats.reslabs;
|
||||||
dst_bin_stats->curslabs += bin->stats.curslabs;
|
dst_bin_stats->curslabs += bin->stats.curslabs;
|
||||||
|
dst_bin_stats->nonfull_slabs += bin->stats.nonfull_slabs;
|
||||||
malloc_mutex_unlock(tsdn, &bin->lock);
|
malloc_mutex_unlock(tsdn, &bin->lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,9 @@ struct bin_stats_s {
|
||||||
/* Current number of slabs in this bin. */
|
/* Current number of slabs in this bin. */
|
||||||
size_t curslabs;
|
size_t curslabs;
|
||||||
|
|
||||||
|
/* Current size of nonfull slabs heap in this bin. */
|
||||||
|
size_t nonfull_slabs;
|
||||||
|
|
||||||
mutex_prof_data_t mutex_data;
|
mutex_prof_data_t mutex_data;
|
||||||
};
|
};
|
||||||
|
|
|
@ -39,6 +39,8 @@ typedef struct ctl_arena_stats_s {
|
||||||
uint64_t nmalloc_small;
|
uint64_t nmalloc_small;
|
||||||
uint64_t ndalloc_small;
|
uint64_t ndalloc_small;
|
||||||
uint64_t nrequests_small;
|
uint64_t nrequests_small;
|
||||||
|
uint64_t nfills_small;
|
||||||
|
uint64_t nflushes_small;
|
||||||
|
|
||||||
bin_stats_t bstats[SC_NBINS];
|
bin_stats_t bstats[SC_NBINS];
|
||||||
arena_stats_large_t lstats[SC_NSIZES - SC_NBINS];
|
arena_stats_large_t lstats[SC_NSIZES - SC_NBINS];
|
|
@ -86,10 +86,11 @@ emitter_printf(emitter_t *emitter, const char *format, ...) {
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline const char * JEMALLOC_FORMAT_ARG(3)
|
||||||
emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier,
|
emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier,
|
||||||
emitter_justify_t justify, int width) {
|
emitter_justify_t justify, int width) {
|
||||||
size_t written;
|
size_t written;
|
||||||
|
fmt_specifier++;
|
||||||
if (justify == emitter_justify_none) {
|
if (justify == emitter_justify_none) {
|
||||||
written = malloc_snprintf(out_fmt, out_size,
|
written = malloc_snprintf(out_fmt, out_size,
|
||||||
"%%%s", fmt_specifier);
|
"%%%s", fmt_specifier);
|
||||||
|
@ -102,6 +103,7 @@ emitter_gen_fmt(char *out_fmt, size_t out_size, const char *fmt_specifier,
|
||||||
}
|
}
|
||||||
/* Only happens in case of bad format string, which *we* choose. */
|
/* Only happens in case of bad format string, which *we* choose. */
|
||||||
assert(written < out_size);
|
assert(written < out_size);
|
||||||
|
return out_fmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -127,26 +129,27 @@ emitter_print_value(emitter_t *emitter, emitter_justify_t justify, int width,
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
|
|
||||||
#define EMIT_SIMPLE(type, format) \
|
#define EMIT_SIMPLE(type, format) \
|
||||||
emitter_gen_fmt(fmt, FMT_SIZE, format, justify, width); \
|
emitter_printf(emitter, \
|
||||||
emitter_printf(emitter, fmt, *(const type *)value); \
|
emitter_gen_fmt(fmt, FMT_SIZE, format, justify, width), \
|
||||||
|
*(const type *)value);
|
||||||
|
|
||||||
switch (value_type) {
|
switch (value_type) {
|
||||||
case emitter_type_bool:
|
case emitter_type_bool:
|
||||||
emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width);
|
emitter_printf(emitter,
|
||||||
emitter_printf(emitter, fmt, *(const bool *)value ?
|
emitter_gen_fmt(fmt, FMT_SIZE, "%s", justify, width),
|
||||||
"true" : "false");
|
*(const bool *)value ? "true" : "false");
|
||||||
break;
|
break;
|
||||||
case emitter_type_int:
|
case emitter_type_int:
|
||||||
EMIT_SIMPLE(int, "d")
|
EMIT_SIMPLE(int, "%d")
|
||||||
break;
|
break;
|
||||||
case emitter_type_unsigned:
|
case emitter_type_unsigned:
|
||||||
EMIT_SIMPLE(unsigned, "u")
|
EMIT_SIMPLE(unsigned, "%u")
|
||||||
break;
|
break;
|
||||||
case emitter_type_ssize:
|
case emitter_type_ssize:
|
||||||
EMIT_SIMPLE(ssize_t, "zd")
|
EMIT_SIMPLE(ssize_t, "%zd")
|
||||||
break;
|
break;
|
||||||
case emitter_type_size:
|
case emitter_type_size:
|
||||||
EMIT_SIMPLE(size_t, "zu")
|
EMIT_SIMPLE(size_t, "%zu")
|
||||||
break;
|
break;
|
||||||
case emitter_type_string:
|
case emitter_type_string:
|
||||||
str_written = malloc_snprintf(buf, BUF_SIZE, "\"%s\"",
|
str_written = malloc_snprintf(buf, BUF_SIZE, "\"%s\"",
|
||||||
|
@ -156,17 +159,17 @@ emitter_print_value(emitter_t *emitter, emitter_justify_t justify, int width,
|
||||||
* anywhere near the fmt size.
|
* anywhere near the fmt size.
|
||||||
*/
|
*/
|
||||||
assert(str_written < BUF_SIZE);
|
assert(str_written < BUF_SIZE);
|
||||||
emitter_gen_fmt(fmt, FMT_SIZE, "s", justify, width);
|
emitter_printf(emitter,
|
||||||
emitter_printf(emitter, fmt, buf);
|
emitter_gen_fmt(fmt, FMT_SIZE, "%s", justify, width), buf);
|
||||||
break;
|
break;
|
||||||
case emitter_type_uint32:
|
case emitter_type_uint32:
|
||||||
EMIT_SIMPLE(uint32_t, FMTu32)
|
EMIT_SIMPLE(uint32_t, "%" FMTu32)
|
||||||
break;
|
break;
|
||||||
case emitter_type_uint64:
|
case emitter_type_uint64:
|
||||||
EMIT_SIMPLE(uint64_t, FMTu64)
|
EMIT_SIMPLE(uint64_t, "%" FMTu64)
|
||||||
break;
|
break;
|
||||||
case emitter_type_title:
|
case emitter_type_title:
|
||||||
EMIT_SIMPLE(char *const, "s");
|
EMIT_SIMPLE(char *const, "%s");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable();
|
unreachable();
|
|
@ -24,7 +24,7 @@ size_t extent_size_quantize_floor(size_t size);
|
||||||
size_t extent_size_quantize_ceil(size_t size);
|
size_t extent_size_quantize_ceil(size_t size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rb_proto(, extent_avail_, extent_tree_t, extent_t)
|
ph_proto(, extent_avail_, extent_tree_t, extent_t)
|
||||||
ph_proto(, extent_heap_, extent_heap_t, extent_t)
|
ph_proto(, extent_heap_, extent_heap_t, extent_t)
|
||||||
|
|
||||||
bool extents_init(tsdn_t *tsdn, extents_t *extents, extent_state_t state,
|
bool extents_init(tsdn_t *tsdn, extents_t *extents, extent_state_t state,
|
||||||
|
@ -74,4 +74,10 @@ bool extent_merge_wrapper(tsdn_t *tsdn, arena_t *arena,
|
||||||
|
|
||||||
bool extent_boot(void);
|
bool extent_boot(void);
|
||||||
|
|
||||||
|
void extent_util_stats_get(tsdn_t *tsdn, const void *ptr,
|
||||||
|
size_t *nfree, size_t *nregs, size_t *size);
|
||||||
|
void extent_util_stats_verbose_get(tsdn_t *tsdn, const void *ptr,
|
||||||
|
size_t *nfree, size_t *nregs, size_t *size,
|
||||||
|
size_t *bin_nfree, size_t *bin_nregs, void **slabcur_addr);
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_EXTENT_EXTERNS_H */
|
#endif /* JEMALLOC_INTERNAL_EXTENT_EXTERNS_H */
|
|
@ -343,10 +343,30 @@ extent_prof_alloc_time_set(extent_t *extent, nstime_t t) {
|
||||||
nstime_copy(&extent->e_alloc_time, &t);
|
nstime_copy(&extent->e_alloc_time, &t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
extent_is_head_get(extent_t *extent) {
|
||||||
|
if (maps_coalesce) {
|
||||||
|
not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bool)((extent->e_bits & EXTENT_BITS_IS_HEAD_MASK) >>
|
||||||
|
EXTENT_BITS_IS_HEAD_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
extent_is_head_set(extent_t *extent, bool is_head) {
|
||||||
|
if (maps_coalesce) {
|
||||||
|
not_reached();
|
||||||
|
}
|
||||||
|
|
||||||
|
extent->e_bits = (extent->e_bits & ~EXTENT_BITS_IS_HEAD_MASK) |
|
||||||
|
((uint64_t)is_head << EXTENT_BITS_IS_HEAD_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size,
|
extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size,
|
||||||
bool slab, szind_t szind, size_t sn, extent_state_t state, bool zeroed,
|
bool slab, szind_t szind, size_t sn, extent_state_t state, bool zeroed,
|
||||||
bool committed, bool dumpable) {
|
bool committed, bool dumpable, extent_head_state_t is_head) {
|
||||||
assert(addr == PAGE_ADDR2BASE(addr) || !slab);
|
assert(addr == PAGE_ADDR2BASE(addr) || !slab);
|
||||||
|
|
||||||
extent_arena_set(extent, arena);
|
extent_arena_set(extent, arena);
|
||||||
|
@ -360,6 +380,10 @@ extent_init(extent_t *extent, arena_t *arena, void *addr, size_t size,
|
||||||
extent_committed_set(extent, committed);
|
extent_committed_set(extent, committed);
|
||||||
extent_dumpable_set(extent, dumpable);
|
extent_dumpable_set(extent, dumpable);
|
||||||
ql_elm_new(extent, ql_link);
|
ql_elm_new(extent, ql_link);
|
||||||
|
if (!maps_coalesce) {
|
||||||
|
extent_is_head_set(extent, (is_head == EXTENT_IS_HEAD) ? true :
|
||||||
|
false);
|
||||||
|
}
|
||||||
if (config_prof) {
|
if (config_prof) {
|
||||||
extent_prof_tctx_set(extent, NULL);
|
extent_prof_tctx_set(extent, NULL);
|
||||||
}
|
}
|
|
@ -128,7 +128,11 @@ struct extent_s {
|
||||||
#define EXTENT_BITS_BINSHARD_SHIFT (EXTENT_BITS_NFREE_WIDTH + EXTENT_BITS_NFREE_SHIFT)
|
#define EXTENT_BITS_BINSHARD_SHIFT (EXTENT_BITS_NFREE_WIDTH + EXTENT_BITS_NFREE_SHIFT)
|
||||||
#define EXTENT_BITS_BINSHARD_MASK MASK(EXTENT_BITS_BINSHARD_WIDTH, EXTENT_BITS_BINSHARD_SHIFT)
|
#define EXTENT_BITS_BINSHARD_MASK MASK(EXTENT_BITS_BINSHARD_WIDTH, EXTENT_BITS_BINSHARD_SHIFT)
|
||||||
|
|
||||||
#define EXTENT_BITS_SN_SHIFT (EXTENT_BITS_BINSHARD_WIDTH + EXTENT_BITS_BINSHARD_SHIFT)
|
#define EXTENT_BITS_IS_HEAD_WIDTH 1
|
||||||
|
#define EXTENT_BITS_IS_HEAD_SHIFT (EXTENT_BITS_BINSHARD_WIDTH + EXTENT_BITS_BINSHARD_SHIFT)
|
||||||
|
#define EXTENT_BITS_IS_HEAD_MASK MASK(EXTENT_BITS_IS_HEAD_WIDTH, EXTENT_BITS_IS_HEAD_SHIFT)
|
||||||
|
|
||||||
|
#define EXTENT_BITS_SN_SHIFT (EXTENT_BITS_IS_HEAD_WIDTH + EXTENT_BITS_IS_HEAD_SHIFT)
|
||||||
#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT)
|
#define EXTENT_BITS_SN_MASK (UINT64_MAX << EXTENT_BITS_SN_SHIFT)
|
||||||
|
|
||||||
/* Pointer to the extent that this structure is responsible for. */
|
/* Pointer to the extent that this structure is responsible for. */
|
||||||
|
@ -228,4 +232,25 @@ struct extents_s {
|
||||||
bool delay_coalesce;
|
bool delay_coalesce;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following two structs are for experimental purposes. See
|
||||||
|
* experimental_utilization_query_ctl and
|
||||||
|
* experimental_utilization_batch_query_ctl in src/ctl.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct extent_util_stats_s {
|
||||||
|
size_t nfree;
|
||||||
|
size_t nregs;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct extent_util_stats_verbose_s {
|
||||||
|
void *slabcur_addr;
|
||||||
|
size_t nfree;
|
||||||
|
size_t nregs;
|
||||||
|
size_t size;
|
||||||
|
size_t bin_nfree;
|
||||||
|
size_t bin_nregs;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_EXTENT_STRUCTS_H */
|
#endif /* JEMALLOC_INTERNAL_EXTENT_STRUCTS_H */
|
|
@ -4,6 +4,9 @@
|
||||||
typedef struct extent_s extent_t;
|
typedef struct extent_s extent_t;
|
||||||
typedef struct extents_s extents_t;
|
typedef struct extents_s extents_t;
|
||||||
|
|
||||||
|
typedef struct extent_util_stats_s extent_util_stats_t;
|
||||||
|
typedef struct extent_util_stats_verbose_s extent_util_stats_verbose_t;
|
||||||
|
|
||||||
#define EXTENT_HOOKS_INITIALIZER NULL
|
#define EXTENT_HOOKS_INITIALIZER NULL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -12,4 +15,9 @@ typedef struct extents_s extents_t;
|
||||||
*/
|
*/
|
||||||
#define LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT 6
|
#define LG_EXTENT_MAX_ACTIVE_FIT_DEFAULT 6
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EXTENT_NOT_HEAD,
|
||||||
|
EXTENT_IS_HEAD /* Only relevant for Windows && opt.retain. */
|
||||||
|
} extent_head_state_t;
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_EXTENT_TYPES_H */
|
#endif /* JEMALLOC_INTERNAL_EXTENT_TYPES_H */
|
|
@ -360,7 +360,7 @@
|
||||||
*/
|
*/
|
||||||
#undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE
|
#undef JEMALLOC_STRERROR_R_RETURNS_CHAR_WITH_GNU_SOURCE
|
||||||
|
|
||||||
/* Performs additional size-matching sanity checks when defined. */
|
/* Performs additional safety checks when defined. */
|
||||||
#undef JEMALLOC_EXTRA_SIZE_CHECK
|
#undef JEMALLOC_OPT_SAFETY_CHECKS
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
#endif /* JEMALLOC_INTERNAL_DEFS_H_ */
|
|
@ -10,6 +10,7 @@ extern bool malloc_slow;
|
||||||
/* Run-time options. */
|
/* Run-time options. */
|
||||||
extern bool opt_abort;
|
extern bool opt_abort;
|
||||||
extern bool opt_abort_conf;
|
extern bool opt_abort_conf;
|
||||||
|
extern bool opt_confirm_conf;
|
||||||
extern const char *opt_junk;
|
extern const char *opt_junk;
|
||||||
extern bool opt_junk_alloc;
|
extern bool opt_junk_alloc;
|
||||||
extern bool opt_junk_free;
|
extern bool opt_junk_free;
|
||||||
|
@ -51,5 +52,6 @@ void jemalloc_prefork(void);
|
||||||
void jemalloc_postfork_parent(void);
|
void jemalloc_postfork_parent(void);
|
||||||
void jemalloc_postfork_child(void);
|
void jemalloc_postfork_child(void);
|
||||||
bool malloc_initialized(void);
|
bool malloc_initialized(void);
|
||||||
|
void je_sdallocx_noflags(void *ptr, size_t size);
|
||||||
|
|
||||||
#endif /* JEMALLOC_INTERNAL_EXTERNS_H */
|
#endif /* JEMALLOC_INTERNAL_EXTERNS_H */
|
|
@ -161,6 +161,25 @@ static const bool config_log =
|
||||||
false
|
false
|
||||||
#endif
|
#endif
|
||||||
;
|
;
|
||||||
|
/*
|
||||||
|
* Are extra safety checks enabled; things like checking the size of sized
|
||||||
|
* deallocations, double-frees, etc.
|
||||||
|
*/
|
||||||
|
static const bool config_opt_safety_checks =
|
||||||
|
#ifdef JEMALLOC_OPT_SAFETY_CHECKS
|
||||||
|
true
|
||||||
|
#elif defined(JEMALLOC_DEBUG)
|
||||||
|
/*
|
||||||
|
* This lets us only guard safety checks by one flag instead of two; fast
|
||||||
|
* checks can guard solely by config_opt_safety_checks and run in debug mode
|
||||||
|
* too.
|
||||||
|
*/
|
||||||
|
true
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(JEMALLOC_HAVE_SCHED_GETCPU)
|
#if defined(_WIN32) || defined(JEMALLOC_HAVE_SCHED_GETCPU)
|
||||||
/* Currently percpu_arena depends on sched_getcpu. */
|
/* Currently percpu_arena depends on sched_getcpu. */
|
||||||
#define JEMALLOC_PERCPU_ARENA
|
#define JEMALLOC_PERCPU_ARENA
|
|
@ -54,7 +54,7 @@ size_t malloc_vsnprintf(char *str, size_t size, const char *format,
|
||||||
size_t malloc_snprintf(char *str, size_t size, const char *format, ...)
|
size_t malloc_snprintf(char *str, size_t size, const char *format, ...)
|
||||||
JEMALLOC_FORMAT_PRINTF(3, 4);
|
JEMALLOC_FORMAT_PRINTF(3, 4);
|
||||||
/*
|
/*
|
||||||
* The caller can set write_cb and cbopaque to null to choose to print with the
|
* The caller can set write_cb to null to choose to print with the
|
||||||
* je_malloc_message hook.
|
* je_malloc_message hook.
|
||||||
*/
|
*/
|
||||||
void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
|
void malloc_vcprintf(void (*write_cb)(void *, const char *), void *cbopaque,
|
|
@ -1,6 +1,7 @@
|
||||||
#ifndef JEMALLOC_INTERNAL_PROF_INLINES_B_H
|
#ifndef JEMALLOC_INTERNAL_PROF_INLINES_B_H
|
||||||
#define JEMALLOC_INTERNAL_PROF_INLINES_B_H
|
#define JEMALLOC_INTERNAL_PROF_INLINES_B_H
|
||||||
|
|
||||||
|
#include "jemalloc/internal/safety_check.h"
|
||||||
#include "jemalloc/internal/sz.h"
|
#include "jemalloc/internal/sz.h"
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE bool
|
JEMALLOC_ALWAYS_INLINE bool
|
||||||
|
@ -71,7 +72,7 @@ prof_alloc_time_get(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx) {
|
||||||
|
|
||||||
JEMALLOC_ALWAYS_INLINE void
|
JEMALLOC_ALWAYS_INLINE void
|
||||||
prof_alloc_time_set(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx,
|
prof_alloc_time_set(tsdn_t *tsdn, const void *ptr, alloc_ctx_t *alloc_ctx,
|
||||||
nstime_t t) {
|
nstime_t t) {
|
||||||
cassert(config_prof);
|
cassert(config_prof);
|
||||||
assert(ptr != NULL);
|
assert(ptr != NULL);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue