1 | // RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=atexit_sleep_ms=50 %run %t 2>&1 | FileCheck %s |
---|---|
2 | #include <pthread.h> |
3 | #include <stdio.h> |
4 | #include <stdlib.h> |
5 | #include <unistd.h> |
6 | #include <sys/types.h> |
7 | #include <sys/wait.h> |
8 | |
9 | void foo() { |
10 | fprintf(stderr, "CHILD ATEXIT\n"); |
11 | } |
12 | |
13 | void *worker(void *unused) { |
14 | return 0; |
15 | } |
16 | |
17 | int main() { |
18 | pthread_t t; |
19 | pthread_create(&t, NULL, worker, NULL); |
20 | int pid = fork(); |
21 | if (pid == 0) { |
22 | // child |
23 | atexit(foo); |
24 | fprintf(stderr, "CHILD DONE\n"); |
25 | } else { |
26 | pthread_join(t, 0); |
27 | if (waitpid(pid, 0, 0) == -1) { |
28 | perror("waitpid"); |
29 | exit(1); |
30 | } |
31 | fprintf(stderr, "PARENT DONE\n"); |
32 | } |
33 | } |
34 | |
35 | // CHECK: CHILD DONE |
36 | // CHECK: CHILD ATEXIT |
37 | // CHECK: PARENT DONE |
38 |