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