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