Don't dereference NULL tdata in prof_{enter,leave}().

It is possible for the thread's tdata to be NULL late during thread
destruction, so take care not to dereference a NULL pointer in such
cases.
This commit is contained in:
Jason Evans 2014-11-01 00:20:28 -07:00
parent d7a9bab92d
commit 82cb603ed7

View File

@ -253,8 +253,10 @@ prof_enter(tsd_t *tsd, prof_tdata_t *tdata)
cassert(config_prof); cassert(config_prof);
assert(tdata == prof_tdata_get(tsd, false)); assert(tdata == prof_tdata_get(tsd, false));
assert(!tdata->enq); if (tdata != NULL) {
tdata->enq = true; assert(!tdata->enq);
tdata->enq = true;
}
malloc_mutex_lock(&bt2gctx_mtx); malloc_mutex_lock(&bt2gctx_mtx);
} }
@ -262,24 +264,27 @@ prof_enter(tsd_t *tsd, prof_tdata_t *tdata)
JEMALLOC_INLINE_C void JEMALLOC_INLINE_C void
prof_leave(tsd_t *tsd, prof_tdata_t *tdata) prof_leave(tsd_t *tsd, prof_tdata_t *tdata)
{ {
bool idump, gdump;
cassert(config_prof); cassert(config_prof);
assert(tdata == prof_tdata_get(tsd, false)); assert(tdata == prof_tdata_get(tsd, false));
malloc_mutex_unlock(&bt2gctx_mtx); malloc_mutex_unlock(&bt2gctx_mtx);
assert(tdata->enq); if (tdata != NULL) {
tdata->enq = false; bool idump, gdump;
idump = tdata->enq_idump;
tdata->enq_idump = false;
gdump = tdata->enq_gdump;
tdata->enq_gdump = false;
if (idump) assert(tdata->enq);
prof_idump(); tdata->enq = false;
if (gdump) idump = tdata->enq_idump;
prof_gdump(); tdata->enq_idump = false;
gdump = tdata->enq_gdump;
tdata->enq_gdump = false;
if (idump)
prof_idump();
if (gdump)
prof_gdump();
}
} }
#ifdef JEMALLOC_PROF_LIBUNWIND #ifdef JEMALLOC_PROF_LIBUNWIND