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