xref: /llvm-project/compiler-rt/test/lsan/TestCases/Linux/fork.cpp (revision 97ccf6b8c17d4837a413627af6db283a6a1bf162)
1*97ccf6b8SFangrui Song // Test that thread local data is handled correctly after forking without exec().
2*97ccf6b8SFangrui Song // RUN: %clangxx_lsan %s -o %t
3*97ccf6b8SFangrui Song // RUN: %run %t 2>&1
4*97ccf6b8SFangrui Song 
5*97ccf6b8SFangrui Song #include <assert.h>
6*97ccf6b8SFangrui Song #include <stdio.h>
7*97ccf6b8SFangrui Song #include <stdlib.h>
8*97ccf6b8SFangrui Song #include <sys/wait.h>
9*97ccf6b8SFangrui Song #include <unistd.h>
10*97ccf6b8SFangrui Song 
11*97ccf6b8SFangrui Song __thread void *thread_local_var;
12*97ccf6b8SFangrui Song 
main()13*97ccf6b8SFangrui Song int main() {
14*97ccf6b8SFangrui Song   int status = 0;
15*97ccf6b8SFangrui Song   thread_local_var = malloc(1337);
16*97ccf6b8SFangrui Song   pid_t pid = fork();
17*97ccf6b8SFangrui Song   assert(pid >= 0);
18*97ccf6b8SFangrui Song   if (pid > 0) {
19*97ccf6b8SFangrui Song     waitpid(pid, &status, 0);
20*97ccf6b8SFangrui Song     assert(WIFEXITED(status));
21*97ccf6b8SFangrui Song     return WEXITSTATUS(status);
22*97ccf6b8SFangrui Song   }
23*97ccf6b8SFangrui Song   return 0;
24*97ccf6b8SFangrui Song }
25