// Test that thread local data is handled correctly after forking without // exec(). In this test leak checking is initiated from a non-main thread. // RUN: %clangxx_lsan %s -o %t // RUN: %run %t 2>&1 #include <assert.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> __thread void *thread_local_var; void *exit_thread_func(void *arg) { exit(0); } void ExitFromThread() { pthread_t tid; int res; res = pthread_create(&tid, 0, exit_thread_func, 0); assert(res == 0); pthread_join(tid, 0); } int main() { int status = 0; thread_local_var = malloc(1337); pid_t pid = fork(); assert(pid >= 0); if (pid > 0) { waitpid(pid, &status, 0); assert(WIFEXITED(status)); return WEXITSTATUS(status); } else { // Spawn a thread and call exit() from there, to check that we track main // thread's pid correctly even if leak checking is initiated from another // thread. ExitFromThread(); } return 0; }