xref: /llvm-project/compiler-rt/test/tsan/Linux/clone_deadlock.cpp (revision bc84b2857f5bd1550f0be4b0961d6a3ebecfa15d)
1 // RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=atexit_sleep_ms=0 %run %t 2>&1 | FileCheck %s
2 #include "../test.h"
3 #include <errno.h>
4 #include <sched.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7 
8 long counter;
9 
incrementer(void * arg)10 static void *incrementer(void *arg) {
11   for (;;)
12     __sync_fetch_and_add(&counter, 1);
13   return 0;
14 }
15 
cloned(void * arg)16 static int cloned(void *arg) {
17   for (int i = 0; i < 1000; i++)
18     __sync_fetch_and_add(&counter, 1);
19   exit(0);
20   return 0;
21 }
22 
main()23 int main() {
24   barrier_init(&barrier, 2);
25   pthread_t th;
26   pthread_create(&th, 0, incrementer, 0);
27   for (int i = 0; i < 100; i++) {
28     char stack[64 << 10] __attribute__((aligned(64)));
29     int pid = clone(cloned, stack + sizeof(stack), SIGCHLD, 0);
30     if (pid == -1) {
31       fprintf(stderr, "failed to clone: %d\n", errno);
32       exit(1);
33     }
34     while (wait(0) != pid) {
35     }
36   }
37   fprintf(stderr, "DONE\n");
38 }
39 
40 // CHECK: DONE
41