Avoid prof_dump during reentrancy.
This commit is contained in:
parent
268843ac68
commit
05775a3736
@ -96,6 +96,9 @@ prof_sample_accum_update(tsd_t *tsd, size_t usize, bool update,
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
if (tsd->reentrancy_level > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
/* Compute new sample threshold. */
|
/* Compute new sample threshold. */
|
||||||
if (update) {
|
if (update) {
|
||||||
prof_sample_threshold_update(tdata);
|
prof_sample_threshold_update(tdata);
|
||||||
|
32
src/prof.c
32
src/prof.c
@ -1641,30 +1641,30 @@ label_write_error:
|
|||||||
static bool
|
static bool
|
||||||
prof_dump(tsd_t *tsd, bool propagate_err, const char *filename,
|
prof_dump(tsd_t *tsd, bool propagate_err, const char *filename,
|
||||||
bool leakcheck) {
|
bool leakcheck) {
|
||||||
prof_tdata_t *tdata;
|
|
||||||
struct prof_tdata_merge_iter_arg_s prof_tdata_merge_iter_arg;
|
|
||||||
struct prof_gctx_merge_iter_arg_s prof_gctx_merge_iter_arg;
|
|
||||||
struct prof_gctx_dump_iter_arg_s prof_gctx_dump_iter_arg;
|
|
||||||
prof_gctx_tree_t gctxs;
|
|
||||||
bool err;
|
|
||||||
|
|
||||||
cassert(config_prof);
|
cassert(config_prof);
|
||||||
|
assert(tsd->reentrancy_level == 0);
|
||||||
|
|
||||||
tdata = prof_tdata_get(tsd, true);
|
prof_tdata_t * tdata = prof_tdata_get(tsd, true);
|
||||||
if (tdata == NULL) {
|
if (tdata == NULL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre_reentrancy(tsd);
|
||||||
malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_mtx);
|
malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_mtx);
|
||||||
|
|
||||||
|
prof_gctx_tree_t gctxs;
|
||||||
|
struct prof_tdata_merge_iter_arg_s prof_tdata_merge_iter_arg;
|
||||||
|
struct prof_gctx_merge_iter_arg_s prof_gctx_merge_iter_arg;
|
||||||
|
struct prof_gctx_dump_iter_arg_s prof_gctx_dump_iter_arg;
|
||||||
prof_dump_prep(tsd, tdata, &prof_tdata_merge_iter_arg,
|
prof_dump_prep(tsd, tdata, &prof_tdata_merge_iter_arg,
|
||||||
&prof_gctx_merge_iter_arg, &gctxs);
|
&prof_gctx_merge_iter_arg, &gctxs);
|
||||||
err = prof_dump_file(tsd, propagate_err, filename, leakcheck, tdata,
|
bool err = prof_dump_file(tsd, propagate_err, filename, leakcheck, tdata,
|
||||||
&prof_tdata_merge_iter_arg, &prof_gctx_merge_iter_arg,
|
&prof_tdata_merge_iter_arg, &prof_gctx_merge_iter_arg,
|
||||||
&prof_gctx_dump_iter_arg, &gctxs);
|
&prof_gctx_dump_iter_arg, &gctxs);
|
||||||
prof_gctx_finish(tsd, &gctxs);
|
prof_gctx_finish(tsd, &gctxs);
|
||||||
|
|
||||||
malloc_mutex_unlock(tsd_tsdn(tsd), &prof_dump_mtx);
|
malloc_mutex_unlock(tsd_tsdn(tsd), &prof_dump_mtx);
|
||||||
|
post_reentrancy(tsd);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return true;
|
return true;
|
||||||
@ -1757,6 +1757,7 @@ prof_fdump(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tsd = tsd_fetch();
|
tsd = tsd_fetch();
|
||||||
|
assert(tsd->reentrancy_level == 0);
|
||||||
|
|
||||||
malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_seq_mtx);
|
malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_seq_mtx);
|
||||||
prof_dump_filename(filename, 'f', VSEQ_INVALID);
|
prof_dump_filename(filename, 'f', VSEQ_INVALID);
|
||||||
@ -1791,6 +1792,10 @@ prof_idump(tsdn_t *tsdn) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tsd = tsdn_tsd(tsdn);
|
tsd = tsdn_tsd(tsdn);
|
||||||
|
if (tsd->reentrancy_level > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tdata = prof_tdata_get(tsd, false);
|
tdata = prof_tdata_get(tsd, false);
|
||||||
if (tdata == NULL) {
|
if (tdata == NULL) {
|
||||||
return;
|
return;
|
||||||
@ -1812,14 +1817,13 @@ prof_idump(tsdn_t *tsdn) {
|
|||||||
|
|
||||||
bool
|
bool
|
||||||
prof_mdump(tsd_t *tsd, const char *filename) {
|
prof_mdump(tsd_t *tsd, const char *filename) {
|
||||||
char filename_buf[DUMP_FILENAME_BUFSIZE];
|
|
||||||
|
|
||||||
cassert(config_prof);
|
cassert(config_prof);
|
||||||
|
assert(tsd->reentrancy_level == 0);
|
||||||
|
|
||||||
if (!opt_prof || !prof_booted) {
|
if (!opt_prof || !prof_booted) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
char filename_buf[DUMP_FILENAME_BUFSIZE];
|
||||||
if (filename == NULL) {
|
if (filename == NULL) {
|
||||||
/* No filename specified, so automatically generate one. */
|
/* No filename specified, so automatically generate one. */
|
||||||
if (opt_prof_prefix[0] == '\0') {
|
if (opt_prof_prefix[0] == '\0') {
|
||||||
@ -1845,6 +1849,10 @@ prof_gdump(tsdn_t *tsdn) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tsd = tsdn_tsd(tsdn);
|
tsd = tsdn_tsd(tsdn);
|
||||||
|
if (tsd->reentrancy_level > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
tdata = prof_tdata_get(tsd, false);
|
tdata = prof_tdata_get(tsd, false);
|
||||||
if (tdata == NULL) {
|
if (tdata == NULL) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user