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