diff options
Diffstat (limited to 'test/tsan/fork_atexit.cc')
-rw-r--r-- | test/tsan/fork_atexit.cc | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/test/tsan/fork_atexit.cc b/test/tsan/fork_atexit.cc new file mode 100644 index 000000000000..6801d3ffff7e --- /dev/null +++ b/test/tsan/fork_atexit.cc @@ -0,0 +1,37 @@ +// RUN: %clangxx_tsan -O1 %s -o %t && TSAN_OPTIONS="atexit_sleep_ms=50" %run %t 2>&1 | FileCheck %s +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> + +void foo() { + printf("CHILD ATEXIT\n"); +} + +void *worker(void *unused) { + return 0; +} + +int main() { + pthread_t t; + pthread_create(&t, NULL, worker, NULL); + int pid = fork(); + if (pid == 0) { + // child + atexit(foo); + fprintf(stderr, "CHILD DONE\n"); + } else { + pthread_join(t, 0); + if (waitpid(pid, 0, 0) == -1) { + perror("waitpid"); + exit(1); + } + fprintf(stderr, "PARENT DONE\n"); + } +} + +// CHECK: CHILD DONE +// CHECK: CHILD ATEXIT +// CHECK: PARENT DONE |