1 // Test that thread local data is handled correctly after forking without 2 // exec(). In this test leak checking is initiated from a non-main thread. 3 // RUN: %clangxx_lsan %s -o %t 4 // RUN: %run %t 2>&1 5 6 #include <assert.h> 7 #include <pthread.h> 8 #include <stdio.h> 9 #include <stdlib.h> 10 #include <sys/wait.h> 11 #include <unistd.h> 12 13 __thread void *thread_local_var; 14 exit_thread_func(void * arg)15void *exit_thread_func(void *arg) { 16 exit(0); 17 } 18 ExitFromThread()19void ExitFromThread() { 20 pthread_t tid; 21 int res; 22 res = pthread_create(&tid, 0, exit_thread_func, 0); 23 assert(res == 0); 24 pthread_join(tid, 0); 25 } 26 main()27int main() { 28 int status = 0; 29 thread_local_var = malloc(1337); 30 pid_t pid = fork(); 31 assert(pid >= 0); 32 if (pid > 0) { 33 waitpid(pid, &status, 0); 34 assert(WIFEXITED(status)); 35 return WEXITSTATUS(status); 36 } else { 37 // Spawn a thread and call exit() from there, to check that we track main 38 // thread's pid correctly even if leak checking is initiated from another 39 // thread. 40 ExitFromThread(); 41 } 42 return 0; 43 } 44