• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)15 void *exit_thread_func(void *arg) {
16   exit(0);
17 }
18 
ExitFromThread()19 void 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()27 int 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