Home | History | Annotate | Download | only in tsan
      1 // RUN: %clangxx_tsan -stdlib=libstdc++ -static-libstdc++ -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
      2 #include <pthread.h>
      3 #include <stdlib.h>
      4 #include <stdio.h>
      5 #include <sched.h>
      6 
      7 struct Cache {
      8   int x;
      9   explicit Cache(int x)
     10     : x(x) {
     11   }
     12 };
     13 
     14 void *AsyncInit(void *p) {
     15   return new Cache((int)(long)p);
     16 }
     17 
     18 Cache *CreateCache() {
     19   pthread_t t;
     20   pthread_create(&t, 0, AsyncInit, (void*)(long)rand());
     21   void *res;
     22   pthread_join(t, &res);
     23   return (Cache*)res;
     24 }
     25 
     26 void *Thread1(void *x) {
     27   static Cache *c = CreateCache();
     28   if (c->x >= RAND_MAX)
     29     exit(1);
     30   return 0;
     31 }
     32 
     33 int main() {
     34   pthread_t t[2];
     35   pthread_create(&t[0], 0, Thread1, 0);
     36   pthread_create(&t[1], 0, Thread1, 0);
     37   pthread_join(t[0], 0);
     38   pthread_join(t[1], 0);
     39   fprintf(stderr, "PASS\n");
     40 }
     41 
     42 // CHECK-NOT: WARNING: ThreadSanitizer: data race
     43