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