44 lines
		
	
	
		
			1002 B
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1002 B
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 |