diff options
author | Qi Wang <interwq@gwu.edu> | 2017-04-25 01:14:57 (GMT) |
---|---|---|
committer | Qi Wang <interwq@gmail.com> | 2017-04-25 19:54:36 (GMT) |
commit | 05775a37360c7f1d41dc57b73ed5c0f259024d9f (patch) | |
tree | 63a5277f39712d708d27cec37df00ec04f5a1169 /src | |
parent | 268843ac680f688582044621434221bedf78719b (diff) | |
download | jemalloc-05775a37360c7f1d41dc57b73ed5c0f259024d9f.zip jemalloc-05775a37360c7f1d41dc57b73ed5c0f259024d9f.tar.gz jemalloc-05775a37360c7f1d41dc57b73ed5c0f259024d9f.tar.bz2 |
Avoid prof_dump during reentrancy.
Diffstat (limited to 'src')
-rw-r--r-- | src/prof.c | 32 |
1 files changed, 20 insertions, 12 deletions
@@ -1641,30 +1641,30 @@ label_write_error: static bool prof_dump(tsd_t *tsd, bool propagate_err, const char *filename, 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); + assert(tsd->reentrancy_level == 0); - tdata = prof_tdata_get(tsd, true); + prof_tdata_t * tdata = prof_tdata_get(tsd, true); if (tdata == NULL) { return true; } + pre_reentrancy(tsd); 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_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_gctx_dump_iter_arg, &gctxs); prof_gctx_finish(tsd, &gctxs); malloc_mutex_unlock(tsd_tsdn(tsd), &prof_dump_mtx); + post_reentrancy(tsd); if (err) { return true; @@ -1757,6 +1757,7 @@ prof_fdump(void) { return; } tsd = tsd_fetch(); + assert(tsd->reentrancy_level == 0); malloc_mutex_lock(tsd_tsdn(tsd), &prof_dump_seq_mtx); prof_dump_filename(filename, 'f', VSEQ_INVALID); @@ -1791,6 +1792,10 @@ prof_idump(tsdn_t *tsdn) { return; } tsd = tsdn_tsd(tsdn); + if (tsd->reentrancy_level > 0) { + return; + } + tdata = prof_tdata_get(tsd, false); if (tdata == NULL) { return; @@ -1812,14 +1817,13 @@ prof_idump(tsdn_t *tsdn) { bool prof_mdump(tsd_t *tsd, const char *filename) { - char filename_buf[DUMP_FILENAME_BUFSIZE]; - cassert(config_prof); + assert(tsd->reentrancy_level == 0); if (!opt_prof || !prof_booted) { return true; } - + char filename_buf[DUMP_FILENAME_BUFSIZE]; if (filename == NULL) { /* No filename specified, so automatically generate one. */ if (opt_prof_prefix[0] == '\0') { @@ -1845,6 +1849,10 @@ prof_gdump(tsdn_t *tsdn) { return; } tsd = tsdn_tsd(tsdn); + if (tsd->reentrancy_level > 0) { + return; + } + tdata = prof_tdata_get(tsd, false); if (tdata == NULL) { return; |