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