summaryrefslogtreecommitdiffstats
path: root/compiler-rt/test/tsan/getline_nohang.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler-rt/test/tsan/getline_nohang.cc')
-rw-r--r--compiler-rt/test/tsan/getline_nohang.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/compiler-rt/test/tsan/getline_nohang.cc b/compiler-rt/test/tsan/getline_nohang.cc
new file mode 100644
index 00000000000..1dd17f0646a
--- /dev/null
+++ b/compiler-rt/test/tsan/getline_nohang.cc
@@ -0,0 +1,35 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %t
+
+// Make sure TSan doesn't deadlock on a file stream lock at program shutdown.
+// See https://code.google.com/p/thread-sanitizer/issues/detail?id=47
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+void *thread(void *unused) {
+ char *line = NULL;
+ size_t size;
+ int fd[2];
+ pipe(fd);
+ // Forge a non-standard stream to make sure it's not closed.
+ FILE *stream = fdopen(fd[0], "r");
+ while (1) {
+ volatile int res = getline(&line, &size, stream);
+ (void)res;
+ }
+ return NULL;
+}
+
+int main() {
+ pthread_t t;
+ pthread_attr_t a;
+ pthread_attr_init(&a);
+ pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED);
+ pthread_create(&t, &a, thread, NULL);
+ pthread_attr_destroy(&a);
+ fprintf(stderr, "DONE\n");
+ return 0;
+ // ThreadSanitizer used to hang here because of a deadlock on a file stream.
+}
+
+// CHECK: DONE
OpenPOWER on IntegriCloud