brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1002 B · 62702b4 Raw
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