Merge branch 'dev'
This commit is contained in:
commit
7709a64c59
24
ChangeLog
24
ChangeLog
@ -3,8 +3,26 @@ bug fixes are all mentioned, but internal enhancements are omitted here for
|
|||||||
brevity (even though they are more fun to write about). Much more detail can be
|
brevity (even though they are more fun to write about). Much more detail can be
|
||||||
found in the git revision history:
|
found in the git revision history:
|
||||||
|
|
||||||
http://www.canonware.com/cgi-bin/gitweb.cgi?p=jemalloc.git
|
https://github.com/jemalloc/jemalloc
|
||||||
git://canonware.com/jemalloc.git
|
|
||||||
|
* 3.5.1 (February 25, 2014)
|
||||||
|
|
||||||
|
This version primarily addresses minor bugs in test code.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
- Configure Solaris/Illumos to use MADV_FREE.
|
||||||
|
- Fix junk filling for mremap(2)-based huge reallocation. This is only
|
||||||
|
relevant if configuring with the --enable-mremap option specified.
|
||||||
|
- Avoid compilation failure if 'restrict' C99 keyword is not supported by the
|
||||||
|
compiler.
|
||||||
|
- Add a configure test for SSE2 rather than assuming it is usable on i686
|
||||||
|
systems. This fixes test compilation errors, especially on 32-bit Linux
|
||||||
|
systems.
|
||||||
|
- Fix mallctl argument size mismatches (size_t vs. uint64_t) in the stats unit
|
||||||
|
test.
|
||||||
|
- Fix/remove flawed alignment-related overflow tests.
|
||||||
|
- Prevent compiler optimizations that could change backtraces in the
|
||||||
|
prof_accum unit test.
|
||||||
|
|
||||||
* 3.5.0 (January 22, 2014)
|
* 3.5.0 (January 22, 2014)
|
||||||
|
|
||||||
@ -16,7 +34,7 @@ found in the git revision history:
|
|||||||
API. The *allocx() functions are slightly simpler to use because they have
|
API. The *allocx() functions are slightly simpler to use because they have
|
||||||
fewer parameters, they directly return the results of primary interest, and
|
fewer parameters, they directly return the results of primary interest, and
|
||||||
mallocx()/rallocx() avoid the strict aliasing pitfall that
|
mallocx()/rallocx() avoid the strict aliasing pitfall that
|
||||||
allocm()/rallocx() share with posix_memalign(). Note that *allocm() is
|
allocm()/rallocm() share with posix_memalign(). Note that *allocm() is
|
||||||
slated for removal in the next non-bugfix release.
|
slated for removal in the next non-bugfix release.
|
||||||
- Add support for LinuxThreads.
|
- Add support for LinuxThreads.
|
||||||
|
|
||||||
|
15
Makefile.in
15
Makefile.in
@ -128,6 +128,8 @@ TESTS_UNIT := $(srcroot)test/unit/bitmap.c \
|
|||||||
$(srcroot)test/unit/tsd.c \
|
$(srcroot)test/unit/tsd.c \
|
||||||
$(srcroot)test/unit/util.c \
|
$(srcroot)test/unit/util.c \
|
||||||
$(srcroot)test/unit/zero.c
|
$(srcroot)test/unit/zero.c
|
||||||
|
TESTS_UNIT_AUX := $(srcroot)test/unit/prof_accum_a.c \
|
||||||
|
$(srcroot)test/unit/prof_accum_b.c
|
||||||
TESTS_INTEGRATION := $(srcroot)test/integration/aligned_alloc.c \
|
TESTS_INTEGRATION := $(srcroot)test/integration/aligned_alloc.c \
|
||||||
$(srcroot)test/integration/allocated.c \
|
$(srcroot)test/integration/allocated.c \
|
||||||
$(srcroot)test/integration/mallocx.c \
|
$(srcroot)test/integration/mallocx.c \
|
||||||
@ -155,9 +157,10 @@ C_TESTLIB_STRESS_OBJS := $(C_TESTLIB_SRCS:$(srcroot)%.c=$(objroot)%.stress.$(O))
|
|||||||
C_TESTLIB_OBJS := $(C_TESTLIB_UNIT_OBJS) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(C_TESTLIB_STRESS_OBJS)
|
C_TESTLIB_OBJS := $(C_TESTLIB_UNIT_OBJS) $(C_TESTLIB_INTEGRATION_OBJS) $(C_UTIL_INTEGRATION_OBJS) $(C_TESTLIB_STRESS_OBJS)
|
||||||
|
|
||||||
TESTS_UNIT_OBJS := $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%.$(O))
|
TESTS_UNIT_OBJS := $(TESTS_UNIT:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
|
TESTS_UNIT_AUX_OBJS := $(TESTS_UNIT_AUX:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
TESTS_INTEGRATION_OBJS := $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%.$(O))
|
TESTS_INTEGRATION_OBJS := $(TESTS_INTEGRATION:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
TESTS_STRESS_OBJS := $(TESTS_STRESS:$(srcroot)%.c=$(objroot)%.$(O))
|
TESTS_STRESS_OBJS := $(TESTS_STRESS:$(srcroot)%.c=$(objroot)%.$(O))
|
||||||
TESTS_OBJS := $(TESTS_UNIT_OBJS) $(TESTS_INTEGRATION_OBJS) $(TESTS_STRESS_OBJS)
|
TESTS_OBJS := $(TESTS_UNIT_OBJS) $(TESTS_UNIT_AUX_OBJS) $(TESTS_INTEGRATION_OBJS) $(TESTS_STRESS_OBJS)
|
||||||
|
|
||||||
.PHONY: all dist build_doc_html build_doc_man build_doc
|
.PHONY: all dist build_doc_html build_doc_man build_doc
|
||||||
.PHONY: install_bin install_include install_lib
|
.PHONY: install_bin install_include install_lib
|
||||||
@ -206,6 +209,12 @@ $(C_TESTLIB_STRESS_OBJS): $(objroot)test/src/%.stress.$(O): $(srcroot)test/src/%
|
|||||||
$(C_TESTLIB_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST -DJEMALLOC_STRESS_TESTLIB
|
$(C_TESTLIB_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST -DJEMALLOC_STRESS_TESTLIB
|
||||||
$(C_TESTLIB_OBJS): CPPFLAGS += -I$(srcroot)test/include -I$(objroot)test/include
|
$(C_TESTLIB_OBJS): CPPFLAGS += -I$(srcroot)test/include -I$(objroot)test/include
|
||||||
$(TESTS_UNIT_OBJS): CPPFLAGS += -DJEMALLOC_UNIT_TEST
|
$(TESTS_UNIT_OBJS): CPPFLAGS += -DJEMALLOC_UNIT_TEST
|
||||||
|
$(TESTS_UNIT_AUX_OBJS): CPPFLAGS += -DJEMALLOC_UNIT_TEST
|
||||||
|
define make-unit-link-dep
|
||||||
|
$(1): TESTS_UNIT_LINK_OBJS += $(2)
|
||||||
|
$(1): $(2)
|
||||||
|
endef
|
||||||
|
$(foreach test, $(TESTS_UNIT:$(srcroot)test/unit/%.c=$(objroot)test/unit/%$(EXE)), $(eval $(call make-unit-link-dep,$(test),$(filter $(test:%=%_a.$(O)) $(test:%=%_b.$(O)),$(TESTS_UNIT_AUX_OBJS)))))
|
||||||
$(TESTS_INTEGRATION_OBJS): CPPFLAGS += -DJEMALLOC_INTEGRATION_TEST
|
$(TESTS_INTEGRATION_OBJS): CPPFLAGS += -DJEMALLOC_INTEGRATION_TEST
|
||||||
$(TESTS_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST
|
$(TESTS_STRESS_OBJS): CPPFLAGS += -DJEMALLOC_STRESS_TEST
|
||||||
$(TESTS_OBJS): $(objroot)test/%.$(O): $(srcroot)test/%.c
|
$(TESTS_OBJS): $(objroot)test/%.$(O): $(srcroot)test/%.c
|
||||||
@ -248,7 +257,7 @@ $(STATIC_LIBS):
|
|||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(AR) $(ARFLAGS)@AROUT@ $+
|
$(AR) $(ARFLAGS)@AROUT@ $+
|
||||||
|
|
||||||
$(objroot)test/unit/%$(EXE): $(objroot)test/unit/%.$(O) $(C_JET_OBJS) $(C_TESTLIB_UNIT_OBJS)
|
$(objroot)test/unit/%$(EXE): $(objroot)test/unit/%.$(O) $(TESTS_UNIT_LINK_OBJS) $(C_JET_OBJS) $(C_TESTLIB_UNIT_OBJS)
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
$(CC) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(LDFLAGS) $(filter-out -lm,$(LIBS)) -lm $(EXTRA_LDFLAGS)
|
$(CC) $(LDTARGET) $(filter %.$(O),$^) $(call RPATH,$(objroot)lib) $(LDFLAGS) $(filter-out -lm,$(LIBS)) -lm $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
@ -359,7 +368,7 @@ coverage: check
|
|||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src unit $(C_TESTLIB_UNIT_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src unit $(C_TESTLIB_UNIT_OBJS)
|
||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src integration $(C_TESTLIB_INTEGRATION_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src integration $(C_TESTLIB_INTEGRATION_OBJS)
|
||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src stress $(C_TESTLIB_STRESS_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/src stress $(C_TESTLIB_STRESS_OBJS)
|
||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/unit unit $(TESTS_UNIT_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/unit unit $(TESTS_UNIT_OBJS) $(TESTS_UNIT_AUX_OBJS)
|
||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/integration integration $(TESTS_INTEGRATION_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/integration integration $(TESTS_INTEGRATION_OBJS)
|
||||||
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/stress integration $(TESTS_STRESS_OBJS)
|
$(SHELL) $(srcroot)coverage.sh $(srcroot)test/stress integration $(TESTS_STRESS_OBJS)
|
||||||
endif
|
endif
|
||||||
|
30
configure.ac
30
configure.ac
@ -19,7 +19,9 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
|
|||||||
]], [[
|
]], [[
|
||||||
return 0;
|
return 0;
|
||||||
]])],
|
]])],
|
||||||
|
[je_cv_cflags_appended=$1]
|
||||||
AC_MSG_RESULT([yes]),
|
AC_MSG_RESULT([yes]),
|
||||||
|
[je_cv_cflags_appended=]
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
[CFLAGS="${TCFLAGS}"]
|
[CFLAGS="${TCFLAGS}"]
|
||||||
)
|
)
|
||||||
@ -128,6 +130,9 @@ if test "x$CFLAGS" = "x" ; then
|
|||||||
no_CFLAGS="yes"
|
no_CFLAGS="yes"
|
||||||
if test "x$GCC" = "xyes" ; then
|
if test "x$GCC" = "xyes" ; then
|
||||||
JE_CFLAGS_APPEND([-std=gnu99])
|
JE_CFLAGS_APPEND([-std=gnu99])
|
||||||
|
if test "x$je_cv_cflags_appended" = "x-std=gnu99" ; then
|
||||||
|
AC_DEFINE_UNQUOTED([JEMALLOC_HAS_RESTRICT])
|
||||||
|
fi
|
||||||
JE_CFLAGS_APPEND([-Wall])
|
JE_CFLAGS_APPEND([-Wall])
|
||||||
JE_CFLAGS_APPEND([-pipe])
|
JE_CFLAGS_APPEND([-pipe])
|
||||||
JE_CFLAGS_APPEND([-g3])
|
JE_CFLAGS_APPEND([-g3])
|
||||||
@ -193,21 +198,21 @@ CPU_SPINWAIT=""
|
|||||||
case "${host_cpu}" in
|
case "${host_cpu}" in
|
||||||
i[[345]]86)
|
i[[345]]86)
|
||||||
;;
|
;;
|
||||||
i686)
|
i686|x86_64)
|
||||||
JE_COMPILABLE([__asm__], [], [[__asm__ volatile("pause"); return 0;]],
|
JE_COMPILABLE([pause instruction], [],
|
||||||
[je_cv_asm])
|
[[__asm__ volatile("pause"); return 0;]],
|
||||||
if test "x${je_cv_asm}" = "xyes" ; then
|
[je_cv_pause])
|
||||||
|
if test "x${je_cv_pause}" = "xyes" ; then
|
||||||
CPU_SPINWAIT='__asm__ volatile("pause")'
|
CPU_SPINWAIT='__asm__ volatile("pause")'
|
||||||
fi
|
fi
|
||||||
AC_DEFINE_UNQUOTED([HAVE_SSE2], [ ])
|
dnl emmintrin.h fails to compile unless MMX, SSE, and SSE2 are
|
||||||
;;
|
dnl supported.
|
||||||
x86_64)
|
JE_COMPILABLE([SSE2 intrinsics], [
|
||||||
JE_COMPILABLE([__asm__ syntax], [],
|
#include <emmintrin.h>
|
||||||
[[__asm__ volatile("pause"); return 0;]], [je_cv_asm])
|
], [], [je_cv_sse2])
|
||||||
if test "x${je_cv_asm}" = "xyes" ; then
|
if test "x${je_cv_sse2}" = "xyes" ; then
|
||||||
CPU_SPINWAIT='__asm__ volatile("pause")'
|
AC_DEFINE_UNQUOTED([HAVE_SSE2], [ ])
|
||||||
fi
|
fi
|
||||||
AC_DEFINE_UNQUOTED([HAVE_SSE2], [ ])
|
|
||||||
;;
|
;;
|
||||||
powerpc)
|
powerpc)
|
||||||
AC_DEFINE_UNQUOTED([HAVE_ALTIVEC], [ ])
|
AC_DEFINE_UNQUOTED([HAVE_ALTIVEC], [ ])
|
||||||
@ -296,6 +301,7 @@ case "${host}" in
|
|||||||
*-*-solaris2*)
|
*-*-solaris2*)
|
||||||
CFLAGS="$CFLAGS"
|
CFLAGS="$CFLAGS"
|
||||||
abi="elf"
|
abi="elf"
|
||||||
|
AC_DEFINE([JEMALLOC_PURGE_MADVISE_FREE], [ ])
|
||||||
RPATH='-Wl,-R,$(1)'
|
RPATH='-Wl,-R,$(1)'
|
||||||
dnl Solaris needs this for sigwait().
|
dnl Solaris needs this for sigwait().
|
||||||
CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
|
||||||
|
@ -187,6 +187,9 @@
|
|||||||
*/
|
*/
|
||||||
#undef JEMALLOC_HAS_ALLOCA_H
|
#undef JEMALLOC_HAS_ALLOCA_H
|
||||||
|
|
||||||
|
/* C99 restrict keyword supported. */
|
||||||
|
#undef JEMALLOC_HAS_RESTRICT
|
||||||
|
|
||||||
/* sizeof(int) == 2^LG_SIZEOF_INT. */
|
/* sizeof(int) == 2^LG_SIZEOF_INT. */
|
||||||
#undef LG_SIZEOF_INT
|
#undef LG_SIZEOF_INT
|
||||||
|
|
||||||
|
@ -45,3 +45,7 @@
|
|||||||
#ifndef __DECONST
|
#ifndef __DECONST
|
||||||
# define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var))
|
# define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef JEMALLOC_HAS_RESTRICT
|
||||||
|
# define restrict
|
||||||
|
#endif
|
||||||
|
@ -8,7 +8,11 @@ typedef struct prof_ctx_s prof_ctx_t;
|
|||||||
typedef struct prof_tdata_s prof_tdata_t;
|
typedef struct prof_tdata_s prof_tdata_t;
|
||||||
|
|
||||||
/* Option defaults. */
|
/* Option defaults. */
|
||||||
#define PROF_PREFIX_DEFAULT "jeprof"
|
#ifdef JEMALLOC_PROF
|
||||||
|
# define PROF_PREFIX_DEFAULT "jeprof"
|
||||||
|
#else
|
||||||
|
# define PROF_PREFIX_DEFAULT ""
|
||||||
|
#endif
|
||||||
#define LG_PROF_SAMPLE_DEFAULT 19
|
#define LG_PROF_SAMPLE_DEFAULT 19
|
||||||
#define LG_PROF_INTERVAL_DEFAULT -1
|
#define LG_PROF_INTERVAL_DEFAULT -1
|
||||||
|
|
||||||
|
@ -2476,7 +2476,6 @@ bin_info_run_size_calc(arena_bin_info_t *bin_info, size_t min_run_size)
|
|||||||
bin_info->reg_interval) - pad_size;
|
bin_info->reg_interval) - pad_size;
|
||||||
} while (try_hdr_size > try_redzone0_offset);
|
} while (try_hdr_size > try_redzone0_offset);
|
||||||
} while (try_run_size <= arena_maxclass
|
} while (try_run_size <= arena_maxclass
|
||||||
&& try_run_size <= arena_maxclass
|
|
||||||
&& RUN_MAX_OVRHD * (bin_info->reg_interval << 3) >
|
&& RUN_MAX_OVRHD * (bin_info->reg_interval << 3) >
|
||||||
RUN_MAX_OVRHD_RELAX
|
RUN_MAX_OVRHD_RELAX
|
||||||
&& (try_redzone0_offset << RUN_BFP) > RUN_MAX_OVRHD * try_run_size
|
&& (try_redzone0_offset << RUN_BFP) > RUN_MAX_OVRHD * try_run_size
|
||||||
|
10
src/huge.c
10
src/huge.c
@ -171,6 +171,16 @@ huge_ralloc(void *ptr, size_t oldsize, size_t size, size_t extra,
|
|||||||
abort();
|
abort();
|
||||||
memcpy(ret, ptr, copysize);
|
memcpy(ret, ptr, copysize);
|
||||||
chunk_dealloc_mmap(ptr, oldsize);
|
chunk_dealloc_mmap(ptr, oldsize);
|
||||||
|
} else if (config_fill && zero == false && opt_junk && oldsize
|
||||||
|
< newsize) {
|
||||||
|
/*
|
||||||
|
* mremap(2) clobbers the original mapping, so
|
||||||
|
* junk/zero filling is not preserved. There is no
|
||||||
|
* need to zero fill here, since any trailing
|
||||||
|
* uninititialized memory is demand-zeroed by the
|
||||||
|
* kernel, but junk filling must be redone.
|
||||||
|
*/
|
||||||
|
memset(ret + oldsize, 0xa5, newsize - oldsize);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
@ -47,10 +47,10 @@ TEST_BEGIN(test_oom_errors)
|
|||||||
|
|
||||||
#if LG_SIZEOF_PTR == 3
|
#if LG_SIZEOF_PTR == 3
|
||||||
alignment = UINT64_C(0x4000000000000000);
|
alignment = UINT64_C(0x4000000000000000);
|
||||||
size = UINT64_C(0x8400000000000001);
|
size = UINT64_C(0xc000000000000001);
|
||||||
#else
|
#else
|
||||||
alignment = 0x40000000LU;
|
alignment = 0x40000000LU;
|
||||||
size = 0x84000001LU;
|
size = 0xc0000001LU;
|
||||||
#endif
|
#endif
|
||||||
set_errno(0);
|
set_errno(0);
|
||||||
p = aligned_alloc(alignment, size);
|
p = aligned_alloc(alignment, size);
|
||||||
|
@ -39,28 +39,6 @@ TEST_BEGIN(test_basic)
|
|||||||
}
|
}
|
||||||
TEST_END
|
TEST_END
|
||||||
|
|
||||||
TEST_BEGIN(test_alignment_errors)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
size_t nsz, rsz, sz, alignment;
|
|
||||||
|
|
||||||
#if LG_SIZEOF_PTR == 3
|
|
||||||
alignment = UINT64_C(0x4000000000000000);
|
|
||||||
sz = UINT64_C(0x8400000000000001);
|
|
||||||
#else
|
|
||||||
alignment = 0x40000000LU;
|
|
||||||
sz = 0x84000001LU;
|
|
||||||
#endif
|
|
||||||
nsz = 0;
|
|
||||||
assert_d_eq(nallocm(&nsz, sz, ALLOCM_ALIGN(alignment)), ALLOCM_SUCCESS,
|
|
||||||
"Unexpected nallocm() error");
|
|
||||||
rsz = 0;
|
|
||||||
assert_d_ne(allocm(&p, &rsz, sz, ALLOCM_ALIGN(alignment)),
|
|
||||||
ALLOCM_SUCCESS, "Expected error for allocm(&p, %zu, %#x)",
|
|
||||||
sz, ALLOCM_ALIGN(alignment));
|
|
||||||
}
|
|
||||||
TEST_END
|
|
||||||
|
|
||||||
TEST_BEGIN(test_alignment_and_size)
|
TEST_BEGIN(test_alignment_and_size)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@ -126,6 +104,5 @@ main(void)
|
|||||||
|
|
||||||
return (test(
|
return (test(
|
||||||
test_basic,
|
test_basic,
|
||||||
test_alignment_errors,
|
|
||||||
test_alignment_and_size));
|
test_alignment_and_size));
|
||||||
}
|
}
|
||||||
|
@ -34,26 +34,6 @@ TEST_BEGIN(test_basic)
|
|||||||
}
|
}
|
||||||
TEST_END
|
TEST_END
|
||||||
|
|
||||||
TEST_BEGIN(test_alignment_errors)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
size_t nsz, sz, alignment;
|
|
||||||
|
|
||||||
#if LG_SIZEOF_PTR == 3
|
|
||||||
alignment = UINT64_C(0x4000000000000000);
|
|
||||||
sz = UINT64_C(0x8400000000000001);
|
|
||||||
#else
|
|
||||||
alignment = 0x40000000LU;
|
|
||||||
sz = 0x84000001LU;
|
|
||||||
#endif
|
|
||||||
nsz = nallocx(sz, MALLOCX_ALIGN(alignment));
|
|
||||||
assert_zu_ne(nsz, 0, "Unexpected nallocx() error");
|
|
||||||
p = mallocx(sz, MALLOCX_ALIGN(alignment));
|
|
||||||
assert_ptr_null(p, "Expected error for mallocx(%zu, %#x)", sz,
|
|
||||||
MALLOCX_ALIGN(alignment));
|
|
||||||
}
|
|
||||||
TEST_END
|
|
||||||
|
|
||||||
TEST_BEGIN(test_alignment_and_size)
|
TEST_BEGIN(test_alignment_and_size)
|
||||||
{
|
{
|
||||||
size_t nsz, rsz, sz, alignment, total;
|
size_t nsz, rsz, sz, alignment, total;
|
||||||
@ -114,6 +94,5 @@ main(void)
|
|||||||
|
|
||||||
return (test(
|
return (test(
|
||||||
test_basic,
|
test_basic,
|
||||||
test_alignment_errors,
|
|
||||||
test_alignment_and_size));
|
test_alignment_and_size));
|
||||||
}
|
}
|
||||||
|
@ -43,10 +43,10 @@ TEST_BEGIN(test_oom_errors)
|
|||||||
|
|
||||||
#if LG_SIZEOF_PTR == 3
|
#if LG_SIZEOF_PTR == 3
|
||||||
alignment = UINT64_C(0x4000000000000000);
|
alignment = UINT64_C(0x4000000000000000);
|
||||||
size = UINT64_C(0x8400000000000001);
|
size = UINT64_C(0xc000000000000001);
|
||||||
#else
|
#else
|
||||||
alignment = 0x40000000LU;
|
alignment = 0x40000000LU;
|
||||||
size = 0x84000001LU;
|
size = 0xc0000001LU;
|
||||||
#endif
|
#endif
|
||||||
assert_d_ne(posix_memalign(&p, alignment, size), 0,
|
assert_d_ne(posix_memalign(&p, alignment, size), 0,
|
||||||
"Expected error for posix_memalign(&p, %zu, %zu)",
|
"Expected error for posix_memalign(&p, %zu, %zu)",
|
||||||
|
@ -92,9 +92,12 @@ test_junk(size_t sz_min, size_t sz_max)
|
|||||||
s = (char *)rallocx(s, sz+1, 0);
|
s = (char *)rallocx(s, sz+1, 0);
|
||||||
assert_ptr_not_null((void *)s,
|
assert_ptr_not_null((void *)s,
|
||||||
"Unexpected rallocx() failure");
|
"Unexpected rallocx() failure");
|
||||||
assert_ptr_eq(most_recently_junked, junked,
|
if (!config_mremap || sz+1 <= arena_maxclass) {
|
||||||
"Expected region of size %zu to be junk-filled",
|
assert_ptr_eq(most_recently_junked, junked,
|
||||||
sz);
|
"Expected region of size %zu to be "
|
||||||
|
"junk-filled",
|
||||||
|
sz);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
#include "test/jemalloc_test.h"
|
#include "prof_accum.h"
|
||||||
|
|
||||||
#define NTHREADS 4
|
|
||||||
#define NALLOCS_PER_THREAD 50
|
|
||||||
#define DUMP_INTERVAL 1
|
|
||||||
#define BT_COUNT_CHECK_INTERVAL 5
|
|
||||||
|
|
||||||
#ifdef JEMALLOC_PROF
|
#ifdef JEMALLOC_PROF
|
||||||
const char *malloc_conf =
|
const char *malloc_conf =
|
||||||
@ -21,37 +16,6 @@ prof_dump_open_intercept(bool propagate_err, const char *filename)
|
|||||||
return (fd);
|
return (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define alloc_n_proto(n) \
|
|
||||||
static void *alloc_##n(unsigned bits);
|
|
||||||
|
|
||||||
#define alloc_n_gen(n) \
|
|
||||||
static void * \
|
|
||||||
alloc_##n(unsigned bits) \
|
|
||||||
{ \
|
|
||||||
void *p; \
|
|
||||||
\
|
|
||||||
if (bits == 0) \
|
|
||||||
p = mallocx(1, 0); \
|
|
||||||
else { \
|
|
||||||
switch (bits & 0x1U) { \
|
|
||||||
case 0: \
|
|
||||||
p = alloc_0(bits >> 1); \
|
|
||||||
break; \
|
|
||||||
case 1: \
|
|
||||||
p = alloc_1(bits >> 1); \
|
|
||||||
break; \
|
|
||||||
default: not_reached(); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
/* Intentionally sabotage tail call optimization. */ \
|
|
||||||
assert_ptr_not_null(p, "Unexpected mallocx() failure"); \
|
|
||||||
return (p); \
|
|
||||||
}
|
|
||||||
alloc_n_proto(0)
|
|
||||||
alloc_n_proto(1)
|
|
||||||
alloc_n_gen(0)
|
|
||||||
alloc_n_gen(1)
|
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
alloc_from_permuted_backtrace(unsigned thd_ind, unsigned iteration)
|
alloc_from_permuted_backtrace(unsigned thd_ind, unsigned iteration)
|
||||||
{
|
{
|
||||||
|
35
test/unit/prof_accum.h
Normal file
35
test/unit/prof_accum.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "test/jemalloc_test.h"
|
||||||
|
|
||||||
|
#define NTHREADS 4
|
||||||
|
#define NALLOCS_PER_THREAD 50
|
||||||
|
#define DUMP_INTERVAL 1
|
||||||
|
#define BT_COUNT_CHECK_INTERVAL 5
|
||||||
|
|
||||||
|
#define alloc_n_proto(n) \
|
||||||
|
void *alloc_##n(unsigned bits);
|
||||||
|
alloc_n_proto(0)
|
||||||
|
alloc_n_proto(1)
|
||||||
|
|
||||||
|
#define alloc_n_gen(n) \
|
||||||
|
void * \
|
||||||
|
alloc_##n(unsigned bits) \
|
||||||
|
{ \
|
||||||
|
void *p; \
|
||||||
|
\
|
||||||
|
if (bits == 0) \
|
||||||
|
p = mallocx(1, 0); \
|
||||||
|
else { \
|
||||||
|
switch (bits & 0x1U) { \
|
||||||
|
case 0: \
|
||||||
|
p = (alloc_0(bits >> 1)); \
|
||||||
|
break; \
|
||||||
|
case 1: \
|
||||||
|
p = (alloc_1(bits >> 1)); \
|
||||||
|
break; \
|
||||||
|
default: not_reached(); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
/* Intentionally sabotage tail call optimization. */ \
|
||||||
|
assert_ptr_not_null(p, "Unexpected mallocx() failure"); \
|
||||||
|
return (p); \
|
||||||
|
}
|
3
test/unit/prof_accum_a.c
Normal file
3
test/unit/prof_accum_a.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include "prof_accum.h"
|
||||||
|
|
||||||
|
alloc_n_gen(0)
|
3
test/unit/prof_accum_b.c
Normal file
3
test/unit/prof_accum_b.c
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#include "prof_accum.h"
|
||||||
|
|
||||||
|
alloc_n_gen(1)
|
@ -31,21 +31,25 @@ TEST_END
|
|||||||
|
|
||||||
TEST_BEGIN(test_stats_chunks)
|
TEST_BEGIN(test_stats_chunks)
|
||||||
{
|
{
|
||||||
size_t current, total, high;
|
size_t current, high;
|
||||||
size_t sz = sizeof(size_t);
|
uint64_t total;
|
||||||
|
size_t sz;
|
||||||
int expected = config_stats ? 0 : ENOENT;
|
int expected = config_stats ? 0 : ENOENT;
|
||||||
|
|
||||||
|
sz = sizeof(size_t);
|
||||||
assert_d_eq(mallctl("stats.chunks.current", ¤t, &sz, NULL, 0),
|
assert_d_eq(mallctl("stats.chunks.current", ¤t, &sz, NULL, 0),
|
||||||
expected, "Unexpected mallctl() result");
|
expected, "Unexpected mallctl() result");
|
||||||
|
sz = sizeof(uint64_t);
|
||||||
assert_d_eq(mallctl("stats.chunks.total", &total, &sz, NULL, 0),
|
assert_d_eq(mallctl("stats.chunks.total", &total, &sz, NULL, 0),
|
||||||
expected, "Unexpected mallctl() result");
|
expected, "Unexpected mallctl() result");
|
||||||
|
sz = sizeof(size_t);
|
||||||
assert_d_eq(mallctl("stats.chunks.high", &high, &sz, NULL, 0), expected,
|
assert_d_eq(mallctl("stats.chunks.high", &high, &sz, NULL, 0), expected,
|
||||||
"Unexpected mallctl() result");
|
"Unexpected mallctl() result");
|
||||||
|
|
||||||
if (config_stats) {
|
if (config_stats) {
|
||||||
assert_zu_le(current, high,
|
assert_zu_le(current, high,
|
||||||
"current should be no larger than high");
|
"current should be no larger than high");
|
||||||
assert_zu_le(high, total,
|
assert_u64_le((uint64_t)high, total,
|
||||||
"high should be no larger than total");
|
"high should be no larger than total");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,9 +251,9 @@ TEST_BEGIN(test_stats_arenas_bins)
|
|||||||
{
|
{
|
||||||
unsigned arena;
|
unsigned arena;
|
||||||
void *p;
|
void *p;
|
||||||
size_t sz, allocated;
|
size_t sz, allocated, curruns;
|
||||||
uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes;
|
uint64_t epoch, nmalloc, ndalloc, nrequests, nfills, nflushes;
|
||||||
uint64_t nruns, nreruns, curruns;
|
uint64_t nruns, nreruns;
|
||||||
int expected = config_stats ? 0 : ENOENT;
|
int expected = config_stats ? 0 : ENOENT;
|
||||||
|
|
||||||
arena = 0;
|
arena = 0;
|
||||||
@ -287,6 +291,7 @@ TEST_BEGIN(test_stats_arenas_bins)
|
|||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.bins.0.nreruns", &nreruns, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
|
sz = sizeof(size_t);
|
||||||
assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.bins.0.curruns", &curruns, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
|
|
||||||
@ -307,7 +312,7 @@ TEST_BEGIN(test_stats_arenas_bins)
|
|||||||
}
|
}
|
||||||
assert_u64_gt(nruns, 0,
|
assert_u64_gt(nruns, 0,
|
||||||
"At least one run should have been allocated");
|
"At least one run should have been allocated");
|
||||||
assert_u64_gt(curruns, 0,
|
assert_zu_gt(curruns, 0,
|
||||||
"At least one run should be currently allocated");
|
"At least one run should be currently allocated");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,8 +324,8 @@ TEST_BEGIN(test_stats_arenas_lruns)
|
|||||||
{
|
{
|
||||||
unsigned arena;
|
unsigned arena;
|
||||||
void *p;
|
void *p;
|
||||||
uint64_t epoch, nmalloc, ndalloc, nrequests, curruns;
|
uint64_t epoch, nmalloc, ndalloc, nrequests;
|
||||||
size_t sz = sizeof(uint64_t);
|
size_t curruns, sz;
|
||||||
int expected = config_stats ? 0 : ENOENT;
|
int expected = config_stats ? 0 : ENOENT;
|
||||||
|
|
||||||
arena = 0;
|
arena = 0;
|
||||||
@ -333,12 +338,14 @@ TEST_BEGIN(test_stats_arenas_lruns)
|
|||||||
assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
|
assert_d_eq(mallctl("epoch", NULL, NULL, &epoch, sizeof(epoch)), 0,
|
||||||
"Unexpected mallctl() failure");
|
"Unexpected mallctl() failure");
|
||||||
|
|
||||||
|
sz = sizeof(uint64_t);
|
||||||
assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.lruns.0.nmalloc", &nmalloc, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.lruns.0.ndalloc", &ndalloc, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.lruns.0.nrequests", &nrequests, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
|
sz = sizeof(size_t);
|
||||||
assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz,
|
assert_d_eq(mallctl("stats.arenas.0.lruns.0.curruns", &curruns, &sz,
|
||||||
NULL, 0), expected, "Unexpected mallctl() result");
|
NULL, 0), expected, "Unexpected mallctl() result");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user