diff --git a/ChangeLog b/ChangeLog
index 829482fe..c8865059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,10 @@ found in the git revision history:
* 3.x.x (XXX not yet released)
+ New features:
+ - Auto-detect whether running inside Valgrind, thus removing the need to
+ manually specify MALLOC_CONF=valgrind:true.
+
Bug fixes:
- Fix heap profiling crash if sampled object is freed via realloc(p, 0).
diff --git a/doc/jemalloc.xml.in b/doc/jemalloc.xml.in
index 877c500f..8a13a22c 100644
--- a/doc/jemalloc.xml.in
+++ b/doc/jemalloc.xml.in
@@ -846,7 +846,9 @@ for (i = 0; i < nbins; i++) {
0x5a. This is intended for debugging and will
impact performance negatively. This option is disabled by default
unless is specified during
- configuration, in which case it is enabled by default.
+ configuration, in which case it is enabled by default unless running
+ inside Valgrind.
@@ -865,8 +867,9 @@ for (i = 0; i < nbins; i++) {
enabled. This feature is of particular use in combination with Valgrind, which can detect attempts
to access quarantined objects. This is intended for debugging and will
- impact performance negatively. The default quarantine size is
- 0.
+ impact performance negatively. The default quarantine size is 0 unless
+ running inside Valgrind, in which case the default is 16
+ MiB.
@@ -885,7 +888,7 @@ for (i = 0; i < nbins; i++) {
which needs redzones in order to do effective buffer overflow/underflow
detection. This option is intended for debugging and will impact
performance negatively. This option is disabled by
- default.
+ default unless running inside Valgrind.
@@ -926,15 +929,9 @@ for (i = 0; i < nbins; i++) {
[]
Valgrind
- support enabled/disabled. If enabled, several other options are
- automatically modified during options processing to work well with
- Valgrind: opt.junk
- and opt.zero are set
- to false, opt.quarantine is
- set to 16 MiB, and opt.redzone is set to
- true. This option is disabled by default.
+ support enabled/disabled. This option is vestigal because jemalloc
+ auto-detects whether it is running inside Valgrind. This option is
+ disabled by default, unless running inside Valgrind.
@@ -1865,9 +1862,7 @@ malloc_conf = "xmalloc:true";]]>
it detects, because the performance impact for storing such information
would be prohibitive. However, jemalloc does integrate with the most
excellent Valgrind tool if the
- configuration option is enabled and the
- opt.valgrind option
- is enabled.
+ configuration option is enabled.
DIAGNOSTIC MESSAGES
diff --git a/include/jemalloc/internal/jemalloc_internal.h.in b/include/jemalloc/internal/jemalloc_internal.h.in
index 268cd146..c6714ec1 100644
--- a/include/jemalloc/internal/jemalloc_internal.h.in
+++ b/include/jemalloc/internal/jemalloc_internal.h.in
@@ -424,6 +424,7 @@ static const bool config_ivsalloc =
VALGRIND_FREELIKE_BLOCK(ptr, rzsize); \
} while (0)
#else
+#define RUNNING_ON_VALGRIND ((unsigned)0)
#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB)
#define VALGRIND_FREELIKE_BLOCK(addr, rzB)
diff --git a/src/jemalloc.c b/src/jemalloc.c
index bc54cd7c..77ea8c81 100644
--- a/src/jemalloc.c
+++ b/src/jemalloc.c
@@ -377,6 +377,20 @@ malloc_conf_init(void)
const char *opts, *k, *v;
size_t klen, vlen;
+ /*
+ * Automatically configure valgrind before processing options. The
+ * valgrind option remains in jemalloc 3.x for compatibility reasons.
+ */
+ if (config_valgrind) {
+ opt_valgrind = (RUNNING_ON_VALGRIND != 0) ? true : false;
+ if (config_fill && opt_valgrind) {
+ opt_junk = false;
+ assert(opt_zero == false);
+ opt_quarantine = JEMALLOC_VALGRIND_QUARANTINE_DEFAULT;
+ opt_redzone = true;
+ }
+ }
+
for (i = 0; i < 3; i++) {
/* Get runtime configuration. */
switch (i) {
@@ -553,20 +567,7 @@ malloc_conf_init(void)
CONF_HANDLE_BOOL(opt_utrace, "utrace")
}
if (config_valgrind) {
- bool hit;
- CONF_HANDLE_BOOL_HIT(opt_valgrind,
- "valgrind", hit)
- if (config_fill && opt_valgrind && hit) {
- opt_junk = false;
- opt_zero = false;
- if (opt_quarantine == 0) {
- opt_quarantine =
- JEMALLOC_VALGRIND_QUARANTINE_DEFAULT;
- }
- opt_redzone = true;
- }
- if (hit)
- continue;
+ CONF_HANDLE_BOOL(opt_valgrind, "valgrind")
}
if (config_xmalloc) {
CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc")