12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Make sure TSan doesn't deadlock on a file stream lock at program shutdown. 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// See https://code.google.com/p/thread-sanitizer/issues/detail?id=47 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <pthread.h> 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <stdio.h> 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <unistd.h> 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid *thread(void *unused) { 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines char *line = NULL; 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines size_t size; 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines int fd[2]; 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pipe(fd); 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Forge a non-standard stream to make sure it's not closed. 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines FILE *stream = fdopen(fd[0], "r"); 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines while (1) { 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines volatile int res = getline(&line, &size, stream); 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines (void)res; 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines } 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return NULL; 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesint main() { 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_t t; 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_attr_t a; 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_attr_init(&a); 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_create(&t, &a, thread, NULL); 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines pthread_attr_destroy(&a); 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines fprintf(stderr, "DONE\n"); 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines return 0; 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // ThreadSanitizer used to hang here because of a deadlock on a file stream. 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// CHECK: DONE 36