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