[compiler-rt] r264627 - [tsan] Fix a crash when exiting the main thread (e.g. dispatch_main)

Kuba Brecka via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 28 12:36:25 PDT 2016


Author: kuba.brecka
Date: Mon Mar 28 14:36:25 2016
New Revision: 264627

URL: http://llvm.org/viewvc/llvm-project?rev=264627&view=rev
Log:
[tsan] Fix a crash when exiting the main thread (e.g. dispatch_main)

This patch fixes the custom ThreadState destruction on OS X to avoid crashing when dispatch_main calls pthread_exit which quits the main thread.

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


Added:
    compiler-rt/trunk/test/tsan/Darwin/dispatch_main.mm
Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_platform_mac.cc

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_platform_mac.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_platform_mac.cc?rev=264627&r1=264626&r2=264627&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_platform_mac.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_platform_mac.cc Mon Mar 28 14:36:25 2016
@@ -91,7 +91,11 @@ ThreadState *cur_thread() {
 // handler will try to access the unmapped ThreadState.
 void cur_thread_finalize() {
   uptr thread_identity = (uptr)pthread_self();
-  CHECK_NE(thread_identity, main_thread_identity);
+  if (thread_identity == main_thread_identity) {
+    // Calling dispatch_main() or xpc_main() actually invokes pthread_exit to
+    // exit the main thread. Let's keep the main thread's ThreadState.
+    return;
+  }
   ThreadState **fake_tls = (ThreadState **)MemToShadow(thread_identity);
   internal_munmap(*fake_tls, sizeof(ThreadState));
   *fake_tls = nullptr;

Added: compiler-rt/trunk/test/tsan/Darwin/dispatch_main.mm
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/Darwin/dispatch_main.mm?rev=264627&view=auto
==============================================================================
--- compiler-rt/trunk/test/tsan/Darwin/dispatch_main.mm (added)
+++ compiler-rt/trunk/test/tsan/Darwin/dispatch_main.mm Mon Mar 28 14:36:25 2016
@@ -0,0 +1,38 @@
+// Check that we don't crash when dispatch_main calls pthread_exit which
+// quits the main thread.
+
+// RUN: %clang_tsan %s -o %t -framework Foundation
+// RUN: %env_tsan_opts=ignore_interceptors_accesses=1 %run %t 2>&1 | FileCheck %s
+
+#import <Foundation/Foundation.h>
+
+int main() {
+  NSLog(@"Hello world");
+
+  dispatch_queue_t q = dispatch_queue_create("my.queue", DISPATCH_QUEUE_SERIAL);
+
+  dispatch_async(q, ^{
+    NSLog(@"1");
+  });
+
+  dispatch_async(q, ^{
+    NSLog(@"2");
+  });
+
+  dispatch_async(q, ^{
+    NSLog(@"3");
+
+    dispatch_async(dispatch_get_main_queue(), ^{
+      NSLog(@"Done.");
+      sleep(1);
+      exit(0);
+    });
+  });
+
+  dispatch_main();
+}
+
+// CHECK: Hello world
+// CHECK: Done.
+// CHECK-NOT: WARNING: ThreadSanitizer
+// CHECK-NOT: CHECK failed




More information about the llvm-commits mailing list