[Tsan] Do not flush all streams on exit
authorViktor Kutuzov <vkutuzov@accesssoftek.com>
Tue, 2 Dec 2014 14:59:51 +0000 (14:59 +0000)
committerViktor Kutuzov <vkutuzov@accesssoftek.com>
Tue, 2 Dec 2014 14:59:51 +0000 (14:59 +0000)
Differential Revision: http://reviews.llvm.org/D6462

llvm-svn: 223121

compiler-rt/lib/tsan/rtl/tsan_interceptors.cc

index 7889942..5bede0e 100644 (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);
 }