38 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %env_tsan_opts=atexit_sleep_ms=50 %run %t 2>&1 | FileCheck %s2#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 9void foo() {10 fprintf(stderr, "CHILD ATEXIT\n");11}12 13void *worker(void *unused) {14 return 0;15}16 17int main() {18 pthread_t t;19 pthread_create(&t, NULL, worker, NULL);20 int pid = fork();21 if (pid == 0) {22 // child23 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 DONE36// CHECK: CHILD ATEXIT37// CHECK: PARENT DONE38