forked from OSchip/llvm-project
[TSan] Fix a rare deadlock on multithreaded fork.
If a multi-threaded program calls fork(), TSan ignores all memory accesses in the child to prevent deadlocks in TSan runtime. This is OK, as child is probably going to call exec() as soon as possible. However, a rare deadlocks could be caused by ThreadIgnoreBegin() function itself. ThreadIgnoreBegin() remembers the current stack trace and puts it into the StackDepot to report a warning later if a thread exited with ignores enabled. Using StackDepotPut in a child process is dangerous: it locks a mutex on a slow path, which could be already locked in a parent process. The fix is simple: just don't put current stack traces to StackDepot in ThreadIgnoreBegin() and ThreadIgnoreSyncBegin() functions if we're running after a multithreaded fork. We will not report any "thread exited with ignores enabled" errors in this case anyway. Submitting this without a testcase, as I believe the standalone reproducer is pretty hard to construct. llvm-svn: 205534
This commit is contained in:
parent
5548eadb1c
commit
425314a65f
|
@ -734,7 +734,8 @@ void ThreadIgnoreBegin(ThreadState *thr, uptr pc) {
|
||||||
CHECK_GT(thr->ignore_reads_and_writes, 0);
|
CHECK_GT(thr->ignore_reads_and_writes, 0);
|
||||||
thr->fast_state.SetIgnoreBit();
|
thr->fast_state.SetIgnoreBit();
|
||||||
#ifndef TSAN_GO
|
#ifndef TSAN_GO
|
||||||
thr->mop_ignore_set.Add(CurrentStackId(thr, pc));
|
if (!ctx->after_multithreaded_fork)
|
||||||
|
thr->mop_ignore_set.Add(CurrentStackId(thr, pc));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,7 +756,8 @@ void ThreadIgnoreSyncBegin(ThreadState *thr, uptr pc) {
|
||||||
thr->ignore_sync++;
|
thr->ignore_sync++;
|
||||||
CHECK_GT(thr->ignore_sync, 0);
|
CHECK_GT(thr->ignore_sync, 0);
|
||||||
#ifndef TSAN_GO
|
#ifndef TSAN_GO
|
||||||
thr->sync_ignore_set.Add(CurrentStackId(thr, pc));
|
if (!ctx->after_multithreaded_fork)
|
||||||
|
thr->sync_ignore_set.Add(CurrentStackId(thr, pc));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue