mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-06-22 11:55:47 +03:00
Optimize Valgrind integration.
Forcefully disable tcache if running inside Valgrind, and remove Valgrind calls in tcache-specific code. Restructure Valgrind-related code to move most Valgrind calls out of the fast path functions. Take advantage of static knowledge to elide some branches in JEMALLOC_VALGRIND_REALLOC().
This commit is contained in:
parent
ecd3e59ca3
commit
bd87b01999
12 changed files with 231 additions and 136 deletions
|
|
@ -479,9 +479,10 @@ malloc_conf_init(void)
|
|||
|
||||
while (*opts != '\0' && malloc_conf_next(&opts, &k, &klen, &v,
|
||||
&vlen) == false) {
|
||||
#define CONF_HANDLE_BOOL(o, n) \
|
||||
if (sizeof(n)-1 == klen && strncmp(n, k, \
|
||||
klen) == 0) { \
|
||||
#define CONF_MATCH(n) \
|
||||
(sizeof(n)-1 == klen && strncmp(n, k, klen) == 0)
|
||||
#define CONF_HANDLE_BOOL(o, n, cont) \
|
||||
if (CONF_MATCH(n)) { \
|
||||
if (strncmp("true", v, vlen) == 0 && \
|
||||
vlen == sizeof("true")-1) \
|
||||
o = true; \
|
||||
|
|
@ -493,11 +494,11 @@ malloc_conf_init(void)
|
|||
"Invalid conf value", \
|
||||
k, klen, v, vlen); \
|
||||
} \
|
||||
continue; \
|
||||
if (cont) \
|
||||
continue; \
|
||||
}
|
||||
#define CONF_HANDLE_SIZE_T(o, n, min, max, clip) \
|
||||
if (sizeof(n)-1 == klen && strncmp(n, k, \
|
||||
klen) == 0) { \
|
||||
if (CONF_MATCH(n)) { \
|
||||
uintmax_t um; \
|
||||
char *end; \
|
||||
\
|
||||
|
|
@ -528,8 +529,7 @@ malloc_conf_init(void)
|
|||
continue; \
|
||||
}
|
||||
#define CONF_HANDLE_SSIZE_T(o, n, min, max) \
|
||||
if (sizeof(n)-1 == klen && strncmp(n, k, \
|
||||
klen) == 0) { \
|
||||
if (CONF_MATCH(n)) { \
|
||||
long l; \
|
||||
char *end; \
|
||||
\
|
||||
|
|
@ -550,8 +550,7 @@ malloc_conf_init(void)
|
|||
continue; \
|
||||
}
|
||||
#define CONF_HANDLE_CHAR_P(o, n, d) \
|
||||
if (sizeof(n)-1 == klen && strncmp(n, k, \
|
||||
klen) == 0) { \
|
||||
if (CONF_MATCH(n)) { \
|
||||
size_t cpylen = (vlen <= \
|
||||
sizeof(o)-1) ? vlen : \
|
||||
sizeof(o)-1; \
|
||||
|
|
@ -560,7 +559,7 @@ malloc_conf_init(void)
|
|||
continue; \
|
||||
}
|
||||
|
||||
CONF_HANDLE_BOOL(opt_abort, "abort")
|
||||
CONF_HANDLE_BOOL(opt_abort, "abort", true)
|
||||
/*
|
||||
* Chunks always require at least one header page, plus
|
||||
* one data page in the absence of redzones, or three
|
||||
|
|
@ -599,44 +598,62 @@ malloc_conf_init(void)
|
|||
SIZE_T_MAX, false)
|
||||
CONF_HANDLE_SSIZE_T(opt_lg_dirty_mult, "lg_dirty_mult",
|
||||
-1, (sizeof(size_t) << 3) - 1)
|
||||
CONF_HANDLE_BOOL(opt_stats_print, "stats_print")
|
||||
CONF_HANDLE_BOOL(opt_stats_print, "stats_print", true)
|
||||
if (config_fill) {
|
||||
CONF_HANDLE_BOOL(opt_junk, "junk")
|
||||
CONF_HANDLE_BOOL(opt_junk, "junk", true)
|
||||
CONF_HANDLE_SIZE_T(opt_quarantine, "quarantine",
|
||||
0, SIZE_T_MAX, false)
|
||||
CONF_HANDLE_BOOL(opt_redzone, "redzone")
|
||||
CONF_HANDLE_BOOL(opt_zero, "zero")
|
||||
CONF_HANDLE_BOOL(opt_redzone, "redzone", true)
|
||||
CONF_HANDLE_BOOL(opt_zero, "zero", true)
|
||||
}
|
||||
if (config_utrace) {
|
||||
CONF_HANDLE_BOOL(opt_utrace, "utrace")
|
||||
CONF_HANDLE_BOOL(opt_utrace, "utrace", true)
|
||||
}
|
||||
if (config_xmalloc) {
|
||||
CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc")
|
||||
CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc", true)
|
||||
}
|
||||
if (config_tcache) {
|
||||
CONF_HANDLE_BOOL(opt_tcache, "tcache")
|
||||
CONF_HANDLE_BOOL(opt_tcache, "tcache",
|
||||
!config_valgrind || !in_valgrind)
|
||||
if (CONF_MATCH("tcache")) {
|
||||
assert(config_valgrind && in_valgrind);
|
||||
if (opt_tcache) {
|
||||
opt_tcache = false;
|
||||
malloc_conf_error(
|
||||
"tcache cannot be enabled "
|
||||
"while running inside Valgrind",
|
||||
k, klen, v, vlen);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
CONF_HANDLE_SSIZE_T(opt_lg_tcache_max,
|
||||
"lg_tcache_max", -1,
|
||||
(sizeof(size_t) << 3) - 1)
|
||||
}
|
||||
if (config_prof) {
|
||||
CONF_HANDLE_BOOL(opt_prof, "prof")
|
||||
CONF_HANDLE_BOOL(opt_prof, "prof", true)
|
||||
CONF_HANDLE_CHAR_P(opt_prof_prefix,
|
||||
"prof_prefix", "jeprof")
|
||||
CONF_HANDLE_BOOL(opt_prof_active, "prof_active")
|
||||
CONF_HANDLE_BOOL(opt_prof_active, "prof_active",
|
||||
true)
|
||||
CONF_HANDLE_SSIZE_T(opt_lg_prof_sample,
|
||||
"lg_prof_sample", 0,
|
||||
(sizeof(uint64_t) << 3) - 1)
|
||||
CONF_HANDLE_BOOL(opt_prof_accum, "prof_accum")
|
||||
CONF_HANDLE_BOOL(opt_prof_accum, "prof_accum",
|
||||
true)
|
||||
CONF_HANDLE_SSIZE_T(opt_lg_prof_interval,
|
||||
"lg_prof_interval", -1,
|
||||
(sizeof(uint64_t) << 3) - 1)
|
||||
CONF_HANDLE_BOOL(opt_prof_gdump, "prof_gdump")
|
||||
CONF_HANDLE_BOOL(opt_prof_final, "prof_final")
|
||||
CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak")
|
||||
CONF_HANDLE_BOOL(opt_prof_gdump, "prof_gdump",
|
||||
true)
|
||||
CONF_HANDLE_BOOL(opt_prof_final, "prof_final",
|
||||
true)
|
||||
CONF_HANDLE_BOOL(opt_prof_leak, "prof_leak",
|
||||
true)
|
||||
}
|
||||
malloc_conf_error("Invalid conf pair", k, klen, v,
|
||||
vlen);
|
||||
#undef CONF_MATCH
|
||||
#undef CONF_HANDLE_BOOL
|
||||
#undef CONF_HANDLE_SIZE_T
|
||||
#undef CONF_HANDLE_SSIZE_T
|
||||
|
|
@ -1293,8 +1310,8 @@ je_realloc(void *ptr, size_t size)
|
|||
ta->deallocated += old_usize;
|
||||
}
|
||||
UTRACE(ptr, size, ret);
|
||||
JEMALLOC_VALGRIND_REALLOC(ret, usize, ptr, old_usize, old_rzsize,
|
||||
false);
|
||||
JEMALLOC_VALGRIND_REALLOC(true, ret, usize, true, ptr, old_usize,
|
||||
old_rzsize, true, false);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
|
@ -1604,7 +1621,8 @@ je_rallocx(void *ptr, size_t size, int flags)
|
|||
ta->deallocated += old_usize;
|
||||
}
|
||||
UTRACE(ptr, size, p);
|
||||
JEMALLOC_VALGRIND_REALLOC(p, usize, ptr, old_usize, old_rzsize, zero);
|
||||
JEMALLOC_VALGRIND_REALLOC(true, p, usize, false, ptr, old_usize,
|
||||
old_rzsize, false, zero);
|
||||
return (p);
|
||||
label_oom:
|
||||
if (config_xmalloc && opt_xmalloc) {
|
||||
|
|
@ -1731,7 +1749,8 @@ je_xallocx(void *ptr, size_t size, size_t extra, int flags)
|
|||
ta->allocated += usize;
|
||||
ta->deallocated += old_usize;
|
||||
}
|
||||
JEMALLOC_VALGRIND_REALLOC(ptr, usize, ptr, old_usize, old_rzsize, zero);
|
||||
JEMALLOC_VALGRIND_REALLOC(false, ptr, usize, false, ptr, old_usize,
|
||||
old_rzsize, false, zero);
|
||||
label_not_resized:
|
||||
UTRACE(ptr, size, ptr);
|
||||
return (usize);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue