12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
2ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov#include <pthread.h>
3ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov#include <stdio.h>
4ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov#include <unistd.h>
5ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov
6ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovint Global;
7ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov
8ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovextern "C" void AnnotateIgnoreWritesBegin(const char *f, int l);
9ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovextern "C" void AnnotateIgnoreWritesEnd(const char *f, int l);
10ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovextern "C" void AnnotateIgnoreReadsBegin(const char *f, int l);
11ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovextern "C" void AnnotateIgnoreReadsEnd(const char *f, int l);
12ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov
13ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovvoid *Thread(void *x) {
14ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  AnnotateIgnoreWritesBegin(__FILE__, __LINE__);
15ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  AnnotateIgnoreReadsBegin(__FILE__, __LINE__);
16ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  Global = 42;
17ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  AnnotateIgnoreReadsEnd(__FILE__, __LINE__);
18ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  AnnotateIgnoreWritesEnd(__FILE__, __LINE__);
19ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  return 0;
20ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov}
21ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov
22ad9da372f962495b3487685232d09390be841b1cDmitry Vyukovint main() {
23ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  pthread_t t;
24ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  pthread_create(&t, 0, Thread, 0);
2563a22f073dcdfbabc492ca4c9eb06d0571915570Dmitry Vyukov  sleep(1);
26ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  Global = 43;
27ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov  pthread_join(t, 0);
28bd88c187a9eaed794b9098aaf147f9dada8c5131Dmitry Vyukov  printf("OK\n");
29ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov}
30ad9da372f962495b3487685232d09390be841b1cDmitry Vyukov
313617ad70f3ade71b944b35fa3faaadfb97700deaDmitry Vyukov// CHECK-NOT: WARNING: ThreadSanitizer: data race
32