tsan: fix trace initialization during thread id reuse
The current code leaves the first event in the trace part uninitialized (from the previous thread). It can cause unpredictable behavior during stack/mutexset restoration. Initialize the first event to a fake harmless memory access. llvm-svn: 224834
This commit is contained in:
parent
25b383ac66
commit
bda655004e
|
@ -111,15 +111,13 @@ void ThreadContext::OnStarted(void *arg) {
|
|||
thr->dd_pt = ctx->dd->CreatePhysicalThread();
|
||||
thr->dd_lt = ctx->dd->CreateLogicalThread(unique_id);
|
||||
}
|
||||
thr->fast_state.SetHistorySize(flags()->history_size);
|
||||
// Commit switch to the new part of the trace.
|
||||
// TraceAddEvent will reset stack0/mset0 in the new part for us.
|
||||
TraceAddEvent(thr, thr->fast_state, EventTypeMop, 0);
|
||||
|
||||
thr->fast_synch_epoch = epoch0;
|
||||
AcquireImpl(thr, 0, &sync);
|
||||
thr->fast_state.SetHistorySize(flags()->history_size);
|
||||
const uptr trace = (epoch0 / kTracePartSize) % TraceParts();
|
||||
Trace *thr_trace = ThreadTrace(thr->tid);
|
||||
TraceHeader *hdr = &thr_trace->headers[trace];
|
||||
hdr->epoch0 = epoch0;
|
||||
ObtainCurrentStack(thr, 0, &hdr->stack0);
|
||||
hdr->mset0 = thr->mset;
|
||||
StatInc(thr, StatSyncAcquire);
|
||||
sync.Reset(&thr->clock_cache);
|
||||
DPrintf("#%d: ThreadStart epoch=%zu stk_addr=%zx stk_size=%zx "
|
||||
|
|
Loading…
Reference in New Issue