brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.4 KiB · f0deb44 Raw
61 lines · cpp
1// Test that lsan handles tls correctly for many threads2// RUN: %clangxx_lsan %s -o %t3// RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=0" not %run %t 2>&1 | FileCheck %s4// RUN: %env_lsan_opts="report_objects=1:use_stacks=0:use_registers=0:use_tls=1" %run %t 2>&15// RUN: %env_lsan_opts="" %run %t 2>&16 7// Patch r303906 did not fix all the problems.8// UNSUPPORTED: arm-linux,armhf-linux9 10#include <assert.h>11#include <limits.h>12#include <pthread.h>13#include <stdlib.h>14#include <unistd.h>15 16static const int NUM_THREADS = 10;17 18pthread_cond_t cond = PTHREAD_COND_INITIALIZER;19pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;20int finished = 0;21 22__thread void *ptr1;23__thread void *ptr2;24__thread void *ptr3;25__thread void *ptr4;26__thread void *ptr5;27 28void alloc() {29  ptr1 = malloc(1111);30  ptr2 = malloc(2222);31  ptr3 = malloc(3333);32  ptr4 = malloc(4444);33  ptr5 = malloc(5555);34}35 36void *thread_start(void *arg) {37  alloc();38 39  pthread_mutex_lock(&mutex);40  finished++;41  pthread_mutex_unlock(&mutex);42 43  // don't exit, to intentionally leak tls data44  while (1)45    sleep(100);46}47 48int main() {49  pthread_t thread[NUM_THREADS];50  for (int i = 0; i < NUM_THREADS; ++i) {51    assert(0 == pthread_create(&thread[i], 0, thread_start, 0));52  }53  // spin until all threads have finished54  while (finished < NUM_THREADS)55    sleep(1);56  exit(0);57}58 59// CHECK: LeakSanitizer: detected memory leaks60// CHECK: SUMMARY: {{.*}}Sanitizer:61