1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-DIE
2*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=die_after_fork=0 %run %t 2>&1 | FileCheck %s -check-prefix=CHECK-NODIE
3*bcaeed49SFangrui Song #include "test.h"
4*bcaeed49SFangrui Song #include <errno.h>
5*bcaeed49SFangrui Song #include <sys/types.h>
6*bcaeed49SFangrui Song #include <sys/wait.h>
7*bcaeed49SFangrui Song 
8*bcaeed49SFangrui Song static void *sleeper(void *p) {
9*bcaeed49SFangrui Song   sleep(1000);  // not intended to exit during test
10*bcaeed49SFangrui Song   return 0;
11*bcaeed49SFangrui Song }
12*bcaeed49SFangrui Song 
13*bcaeed49SFangrui Song static void *nop(void *p) {
14*bcaeed49SFangrui Song   return 0;
15*bcaeed49SFangrui Song }
16*bcaeed49SFangrui Song 
17*bcaeed49SFangrui Song int main() {
18*bcaeed49SFangrui Song   barrier_init(&barrier, 2);
19*bcaeed49SFangrui Song   pthread_t th;
20*bcaeed49SFangrui Song   pthread_create(&th, 0, sleeper, 0);
21*bcaeed49SFangrui Song   switch (fork()) {
22*bcaeed49SFangrui Song   default:  // parent
23*bcaeed49SFangrui Song     while (wait(0) < 0) {}
24*bcaeed49SFangrui Song     break;
25*bcaeed49SFangrui Song   case 0:  // child
26*bcaeed49SFangrui Song     {
27*bcaeed49SFangrui Song       pthread_t th2;
28*bcaeed49SFangrui Song       pthread_create(&th2, 0, nop, 0);
29*bcaeed49SFangrui Song       exit(0);
30*bcaeed49SFangrui Song       break;
31*bcaeed49SFangrui Song     }
32*bcaeed49SFangrui Song   case -1:  // error
33*bcaeed49SFangrui Song     fprintf(stderr, "failed to fork (%d)\n", errno);
34*bcaeed49SFangrui Song     exit(1);
35*bcaeed49SFangrui Song   }
36*bcaeed49SFangrui Song   fprintf(stderr, "OK\n");
37*bcaeed49SFangrui Song }
38*bcaeed49SFangrui Song 
39*bcaeed49SFangrui Song // CHECK-DIE: ThreadSanitizer: starting new threads after multi-threaded fork is not supported
40*bcaeed49SFangrui Song // CHECK-DIE: OK
41*bcaeed49SFangrui Song 
42*bcaeed49SFangrui Song // CHECK-NODIE-NOT: ThreadSanitizer: starting new threads after multi-threaded fork is not supported
43*bcaeed49SFangrui Song // CHECK-NODIE: OK
44*bcaeed49SFangrui Song 
45