Home | History | Annotate | Download | only in tsan
      1 // RUN: %clangxx_tsan %s -o %t
      2 // RUN: %run %t 2>&1 | FileCheck %s
      3 
      4 #include <pthread.h>
      5 #include <stdlib.h>
      6 #include <stddef.h>
      7 #include <unistd.h>
      8 #include <stdio.h>
      9 #include <time.h>
     10 #include <sys/mman.h>
     11 
     12 const long kSmallPage = 4 << 10;
     13 const long kLargePage = 2 << 20;
     14 
     15 typedef unsigned long uptr;
     16 
     17 int main(int argc, const char **argv) {
     18   uptr mem_size = 4 << 20;
     19   if (argc > 1)
     20     mem_size = (uptr)atoi(argv[1]) << 20;
     21   uptr stride = kSmallPage;
     22   if (argc > 2)
     23     stride = (uptr)atoi(argv[2]) << 10;
     24   int niter = 1;
     25   if (argc > 3)
     26     niter = atoi(argv[3]);
     27 
     28   void *p = mmap(0, mem_size + kLargePage, PROT_READ | PROT_WRITE,
     29       MAP_ANON | MAP_PRIVATE, -1, 0);
     30   uptr a = ((uptr)p + kLargePage - 1) & ~(kLargePage - 1);
     31   volatile char *mem = (volatile char *)a;
     32 
     33   for (int i = 0; i < niter; i++) {
     34     for (uptr off = 0; off < mem_size; off += stride)
     35       mem[off] = 42;
     36   }
     37 
     38   fprintf(stderr, "DONE\n");
     39 }
     40 
     41 // CHECK: DONE
     42 
     43