44 lines · cpp
1// Test that thread local data is handled correctly after forking without2// exec(). In this test leak checking is initiated from a non-main thread.3// RUN: %clangxx_lsan %s -o %t4// RUN: %run %t 2>&15 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 15void *exit_thread_func(void *arg) {16 exit(0);17}18 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 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 main38 // thread's pid correctly even if leak checking is initiated from another39 // thread.40 ExitFromThread();41 }42 return 0;43}44