1c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev// Test that thread local data is handled correctly after forking without exec(). 2c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev// RUN: %clangxx_lsan %s -o %t 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t 2>&1 4c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev 5c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <assert.h> 6c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <stdio.h> 7c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <stdlib.h> 8c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <sys/wait.h> 9c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev#include <unistd.h> 10c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev 11c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev__thread void *thread_local_var; 12c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev 13c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveevint main() { 14c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev int status = 0; 15c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev thread_local_var = malloc(1337); 16c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev pid_t pid = fork(); 17c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev assert(pid >= 0); 18c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev if (pid > 0) { 19c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev waitpid(pid, &status, 0); 20c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev assert(WIFEXITED(status)); 21c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev return WEXITSTATUS(status); 22c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev } 23c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev return 0; 24c6ac98d7fcc81768b2ef7ddc785c27e3fc1bdef6Sergey Matveev} 25