diff options
Diffstat (limited to 'compiler-rt/test/tsan/getline_nohang.cc')
-rw-r--r-- | compiler-rt/test/tsan/getline_nohang.cc | 35 |
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 |