Home | History | Annotate | Download | only in tsan
      1 // RUN: %clangxx_tsan -O1 %s -o %t && TSAN_OPTIONS="atexit_sleep_ms=50" %run %t 2>&1 | FileCheck %s
      2 #include <stdlib.h>
      3 #include <stdio.h>
      4 #include <errno.h>
      5 #include <pthread.h>
      6 #include <unistd.h>
      7 #include <sys/types.h>
      8 #include <sys/wait.h>
      9 
     10 int counter;
     11 
     12 static void *incrementer(void *p) {
     13   for (;;)
     14     __sync_fetch_and_add(&counter, 1);
     15   return 0;
     16 }
     17 
     18 static void *watchdog(void *p) {
     19   sleep(100);
     20   fprintf(stderr, "timed out after 100 seconds\n");
     21   exit(1);
     22   return 0;
     23 }
     24 
     25 int main() {
     26   pthread_t th1, th2;
     27   pthread_create(&th1, 0, incrementer, 0);
     28   pthread_create(&th2, 0, watchdog, 0);
     29   for (int i = 0; i < 10; i++) {
     30     switch (fork()) {
     31     default:  // parent
     32       while (wait(0) < 0) {}
     33       fprintf(stderr, ".");
     34       break;
     35     case 0:  // child
     36       __sync_fetch_and_add(&counter, 1);
     37       exit(0);
     38       break;
     39     case -1:  // error
     40       fprintf(stderr, "failed to fork (%d)\n", errno);
     41       exit(1);
     42     }
     43   }
     44   fprintf(stderr, "OK\n");
     45 }
     46 
     47 // CHECK: OK
     48 
     49