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