]>
Commit | Line | Data |
---|---|---|
1a4d82fc | 1 | // Regression test. Disabler should not depend on TSD validity. |
5bcae85e | 2 | // RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1:use_ld_allocations=0" |
3157f602 | 3 | // RUN: %clang_lsan %s -o %t |
1a4d82fc JJ |
4 | // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t |
5 | ||
6 | #include <assert.h> | |
7 | #include <pthread.h> | |
8 | #include <stdio.h> | |
9 | #include <stdlib.h> | |
10 | ||
11 | #include "sanitizer/lsan_interface.h" | |
12 | ||
13 | pthread_key_t key; | |
14 | ||
15 | void key_destructor(void *arg) { | |
3157f602 | 16 | __lsan_disable(); |
1a4d82fc JJ |
17 | void *p = malloc(1337); |
18 | // Break optimization. | |
19 | fprintf(stderr, "Test alloc: %p.\n", p); | |
20 | pthread_setspecific(key, 0); | |
3157f602 | 21 | __lsan_enable(); |
1a4d82fc JJ |
22 | } |
23 | ||
24 | void *thread_func(void *arg) { | |
25 | int res = pthread_setspecific(key, (void*)1); | |
26 | assert(res == 0); | |
27 | return 0; | |
28 | } | |
29 | ||
30 | int main() { | |
31 | int res = pthread_key_create(&key, &key_destructor); | |
32 | assert(res == 0); | |
33 | pthread_t thread_id; | |
34 | res = pthread_create(&thread_id, 0, thread_func, 0); | |
35 | assert(res == 0); | |
36 | res = pthread_join(thread_id, 0); | |
37 | assert(res == 0); | |
38 | return 0; | |
39 | } |