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 Rytarowski void 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 Rytarowski void *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 Rytarowski int 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