1200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev// Regression test. Disabler should not depend on TSD validity.
2200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev// RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1"
3200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev// RUN: %clangxx_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) {
16200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  __lsan::ScopedDisabler d;
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);
21200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
22200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
23200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveevvoid *thread_func(void *arg) {
24200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  int res = pthread_setspecific(key, (void*)1);
25200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
26200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  return 0;
27200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
28200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev
29200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveevint main() {
30200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  int res = pthread_key_create(&key, &key_destructor);
31200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
32200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  pthread_t thread_id;
33200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  res = pthread_create(&thread_id, 0, thread_func, 0);
34200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
35200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  res = pthread_join(thread_id, 0);
36200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  assert(res == 0);
37200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev  return 0;
38200afbd8ba4904241c1ebcef4fa79d739ca01f73Sergey Matveev}
39