1200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev// Regression test. Disabler should not depend on TSD validity.
2c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1:use_ld_allocations=0"
3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %clang_lsan %s -o %t
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: LSAN_OPTIONS=$LSAN_BASE %run %t
5200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
6200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev#include <assert.h>
7200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev#include <pthread.h>
8200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev#include <stdio.h>
9200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev#include <stdlib.h>
10200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
11200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev#include "sanitizer/lsan_interface.h"
12200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
13200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveevpthread_key_t key;
14200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
15ac78d0087281e9b40bb043f827fbde8c05c6505aSergey Matveevvoid key_destructor(void *arg) {
16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  __lsan_disable();
17200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  void *p = malloc(1337);
18200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  // Break optimization.
19200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  fprintf(stderr, "Test alloc: %p.\n", p);
20200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  pthread_setspecific(key, 0);
21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  __lsan_enable();
22200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
23200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
24200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveevvoid *thread_func(void *arg) {
25200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  int res = pthread_setspecific(key, (void*)1);
26200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
27200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  return 0;
28200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
29200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
30200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveevint main() {
31200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  int res = pthread_key_create(&key, &key_destructor);
32200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
33200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  pthread_t thread_id;
34200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  res = pthread_create(&thread_id, 0, thread_func, 0);
35200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
36200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  res = pthread_join(thread_id, 0);
37200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
38200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  return 0;
39200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
40