Auto-detect whether running inside Valgrind.

Auto-detect whether running inside Valgrind, thus removing the need to
manually specify MALLOC_CONF=valgrind:true.
This commit is contained in:
Jason Evans 2012-05-15 14:48:14 -07:00
parent 3860eac170
commit 781fe75e0a
4 changed files with 31 additions and 30 deletions

View File

@ -8,6 +8,10 @@ found in the git revision history:
* 3.x.x (XXX not yet released) * 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: Bug fixes:
- Fix heap profiling crash if sampled object is freed via realloc(p, 0). - Fix heap profiling crash if sampled object is freed via realloc(p, 0).

View File

@ -846,7 +846,9 @@ for (i = 0; i < nbins; i++) {
<literal>0x5a</literal>. This is intended for debugging and will <literal>0x5a</literal>. This is intended for debugging and will
impact performance negatively. This option is disabled by default impact performance negatively. This option is disabled by default
unless <option>--enable-debug</option> is specified during unless <option>--enable-debug</option> is specified during
configuration, in which case it is enabled by default.</para></listitem> configuration, in which case it is enabled by default unless running
inside <ulink
url="http://valgrind.org/">Valgrind</ulink>.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry id="opt.quarantine"> <varlistentry id="opt.quarantine">
@ -865,8 +867,9 @@ for (i = 0; i < nbins; i++) {
enabled. This feature is of particular use in combination with <ulink enabled. This feature is of particular use in combination with <ulink
url="http://valgrind.org/">Valgrind</ulink>, which can detect attempts url="http://valgrind.org/">Valgrind</ulink>, which can detect attempts
to access quarantined objects. This is intended for debugging and will to access quarantined objects. This is intended for debugging and will
impact performance negatively. The default quarantine size is impact performance negatively. The default quarantine size is 0 unless
0.</para></listitem> running inside Valgrind, in which case the default is 16
MiB.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry id="opt.redzone"> <varlistentry id="opt.redzone">
@ -885,7 +888,7 @@ for (i = 0; i < nbins; i++) {
which needs redzones in order to do effective buffer overflow/underflow which needs redzones in order to do effective buffer overflow/underflow
detection. This option is intended for debugging and will impact detection. This option is intended for debugging and will impact
performance negatively. This option is disabled by performance negatively. This option is disabled by
default.</para></listitem> default unless running inside Valgrind.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry id="opt.zero"> <varlistentry id="opt.zero">
@ -926,15 +929,9 @@ for (i = 0; i < nbins; i++) {
[<option>--enable-valgrind</option>] [<option>--enable-valgrind</option>]
</term> </term>
<listitem><para><ulink url="http://valgrind.org/">Valgrind</ulink> <listitem><para><ulink url="http://valgrind.org/">Valgrind</ulink>
support enabled/disabled. If enabled, several other options are support enabled/disabled. This option is vestigal because jemalloc
automatically modified during options processing to work well with auto-detects whether it is running inside Valgrind. This option is
Valgrind: <link linkend="opt.junk"><mallctl>opt.junk</mallctl></link> disabled by default, unless running inside Valgrind.</para></listitem>
and <link linkend="opt.zero"><mallctl>opt.zero</mallctl></link> are set
to false, <link
linkend="opt.quarantine"><mallctl>opt.quarantine</mallctl></link> is
set to 16 MiB, and <link
linkend="opt.redzone"><mallctl>opt.redzone</mallctl></link> is set to
true. This option is disabled by default.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry id="opt.xmalloc"> <varlistentry id="opt.xmalloc">
@ -1865,9 +1862,7 @@ malloc_conf = "xmalloc:true";]]></programlisting>
it detects, because the performance impact for storing such information it detects, because the performance impact for storing such information
would be prohibitive. However, jemalloc does integrate with the most would be prohibitive. However, jemalloc does integrate with the most
excellent <ulink url="http://valgrind.org/">Valgrind</ulink> tool if the excellent <ulink url="http://valgrind.org/">Valgrind</ulink> tool if the
<option>--enable-valgrind</option> configuration option is enabled and the <option>--enable-valgrind</option> configuration option is enabled.</para>
<link linkend="opt.valgrind"><mallctl>opt.valgrind</mallctl></link> option
is enabled.</para>
</refsect1> </refsect1>
<refsect1 id="diagnostic_messages"> <refsect1 id="diagnostic_messages">
<title>DIAGNOSTIC MESSAGES</title> <title>DIAGNOSTIC MESSAGES</title>

View File

@ -424,6 +424,7 @@ static const bool config_ivsalloc =
VALGRIND_FREELIKE_BLOCK(ptr, rzsize); \ VALGRIND_FREELIKE_BLOCK(ptr, rzsize); \
} while (0) } while (0)
#else #else
#define RUNNING_ON_VALGRIND ((unsigned)0)
#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed) #define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
#define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB) #define VALGRIND_RESIZEINPLACE_BLOCK(addr, oldSizeB, newSizeB, rzB)
#define VALGRIND_FREELIKE_BLOCK(addr, rzB) #define VALGRIND_FREELIKE_BLOCK(addr, rzB)

View File

@ -377,6 +377,20 @@ malloc_conf_init(void)
const char *opts, *k, *v; const char *opts, *k, *v;
size_t klen, vlen; 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++) { for (i = 0; i < 3; i++) {
/* Get runtime configuration. */ /* Get runtime configuration. */
switch (i) { switch (i) {
@ -553,20 +567,7 @@ malloc_conf_init(void)
CONF_HANDLE_BOOL(opt_utrace, "utrace") CONF_HANDLE_BOOL(opt_utrace, "utrace")
} }
if (config_valgrind) { if (config_valgrind) {
bool hit; CONF_HANDLE_BOOL(opt_valgrind, "valgrind")
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;
} }
if (config_xmalloc) { if (config_xmalloc) {
CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc") CONF_HANDLE_BOOL(opt_xmalloc, "xmalloc")