Home | History | Annotate | Download | only in tsan
      1 // RUN: %clang_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
      2 #include "test.h"
      3 #include <errno.h>
      4 #include <sys/mman.h>
      5 
      6 void *SubWorker(void *arg) {
      7   (void)arg;
      8   const int kMmapSize =  65536;
      9   for (int i = 0; i < 500; i++) {
     10     int *ptr = (int*)mmap(0, kMmapSize, PROT_READ | PROT_WRITE,
     11                           MAP_PRIVATE | MAP_ANON, -1, 0);
     12     if (ptr == MAP_FAILED)
     13       exit(printf("mmap failed: %d\n", errno));
     14     *ptr = 42;
     15     if (munmap(ptr, kMmapSize))
     16       exit(printf("munmap failed: %d\n", errno));
     17   }
     18   return 0;
     19 }
     20 
     21 void *Worker1(void *arg) {
     22   (void)arg;
     23   pthread_t th[4];
     24   for (int i = 0; i < 4; i++) {
     25     if (pthread_create(&th[i], 0, SubWorker, 0))
     26       exit(printf("pthread_create failed: %d\n", errno));
     27   }
     28   for (int i = 0; i < 4; i++) {
     29     if (pthread_join(th[i], 0))
     30       exit(printf("pthread_join failed: %d\n", errno));
     31   }
     32   return 0;
     33 }
     34 
     35 void *Worker(void *arg) {
     36   (void)arg;
     37   pthread_t th[4];
     38   for (int i = 0; i < 4; i++) {
     39     if (pthread_create(&th[i], 0, Worker1, 0))
     40       exit(printf("pthread_create failed: %d\n", errno));
     41   }
     42   for (int i = 0; i < 4; i++) {
     43     if (pthread_join(th[i], 0))
     44       exit(printf("pthread_join failed: %d\n", errno));
     45   }
     46   return 0;
     47 }
     48 
     49 int main() {
     50   // This test is flaky on several builders:
     51   // https://groups.google.com/d/msg/llvm-dev/KUFPdLhBN3Q/L75rwW9xBgAJ
     52   // The cause is unknown (lit hides test output on failures).
     53 #if 0
     54   pthread_t th[4];
     55   for (int i = 0; i < 4; i++) {
     56     if (pthread_create(&th[i], 0, Worker, 0))
     57       exit(printf("pthread_create failed: %d\n", errno));
     58   }
     59   for (int i = 0; i < 4; i++) {
     60     if (pthread_join(th[i], 0))
     61       exit(printf("pthread_join failed: %d\n", errno));
     62   }
     63 #endif
     64   fprintf(stderr, "DONE\n");
     65 }
     66 
     67 // CHECK: DONE
     68