[Tsan] Do not flush all streams on exit

Differential Revision: http://reviews.llvm.org/D6462

llvm-svn: 223121
This commit is contained in:
Viktor Kutuzov 2014-12-02 14:59:51 +00:00
parent 376aee9ae7
commit fbd6ec09df
1 changed files with 10 additions and 6 deletions

View File

@ -1800,9 +1800,16 @@ TSAN_INTERCEPTOR(uptr, fwrite, const void *p, uptr size, uptr nmemb, void *f) {
return REAL(fwrite)(p, size, nmemb, f);
}
static void FlushStreams() {
// Flushing all the streams here may freeze the process if a child thread is
// performing file stream operations at the same time.
REAL(fflush)(stdout);
REAL(fflush)(stderr);
}
TSAN_INTERCEPTOR(void, abort, int fake) {
SCOPED_TSAN_INTERCEPTOR(abort, fake);
REAL(fflush)(0);
FlushStreams();
REAL(abort)(fake);
}
@ -2131,7 +2138,7 @@ TSAN_INTERCEPTOR(int, vfork, int fake) {
static int OnExit(ThreadState *thr) {
int status = Finalize(thr);
REAL(fflush)(0);
FlushStreams();
return status;
}
@ -2367,10 +2374,7 @@ static void finalize(void *arg) {
ThreadState *thr = cur_thread();
int status = Finalize(thr);
// Make sure the output is not lost.
// Flushing all the streams here may freeze the process if a child thread is
// performing file stream operations at the same time.
REAL(fflush)(stdout);
REAL(fflush)(stderr);
FlushStreams();
if (status)
REAL(_exit)(status);
}