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 
SubWorker(void * arg)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     *ptr = 42;
13     munmap(ptr, kMmapSize);
14   }
15   return 0;
16 }
17 
Worker1(void * arg)18 void *Worker1(void *arg) {
19   (void)arg;
20   pthread_t th[4];
21   for (int i = 0; i < 4; i++)
22     pthread_create(&th[i], 0, SubWorker, 0);
23   for (int i = 0; i < 4; i++)
24     pthread_join(th[i], 0);
25   return 0;
26 }
27 
Worker(void * arg)28 void *Worker(void *arg) {
29   (void)arg;
30   pthread_t th[4];
31   for (int i = 0; i < 4; i++)
32     pthread_create(&th[i], 0, Worker1, 0);
33   for (int i = 0; i < 4; i++)
34     pthread_join(th[i], 0);
35   return 0;
36 }
37 
main()38 int main() {
39   pthread_t th[4];
40   for (int i = 0; i < 4; i++)
41     pthread_create(&th[i], 0, Worker, 0);
42   for (int i = 0; i < 4; i++)
43     pthread_join(th[i], 0);
44   fprintf(stderr, "DONE\n");
45 }
46 
47 // CHECK: DONE
48