1 //===-- asan_posix.cc -----------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is a part of AddressSanitizer, an address sanity checker.
12 // Posix-specific details.
13 //===----------------------------------------------------------------------===//
15 #include "sanitizer_common/sanitizer_platform.h"
18 #include "asan_internal.h"
19 #include "asan_interceptors.h"
20 #include "asan_mapping.h"
21 #include "asan_report.h"
22 #include "asan_stack.h"
23 #include "sanitizer_common/sanitizer_libc.h"
24 #include "sanitizer_common/sanitizer_posix.h"
25 #include "sanitizer_common/sanitizer_procmaps.h"
30 #include <sys/resource.h>
35 void AsanOnDeadlySignal(int signo, void *siginfo, void *context) {
36 StartReportDeadlySignal();
37 SignalContext sig(siginfo, context);
38 ReportDeadlySignal(sig);
41 // ---------------------- TSD ---------------- {{{1
43 static pthread_key_t tsd_key;
44 static bool tsd_key_inited = false;
45 void AsanTSDInit(void (*destructor)(void *tsd)) {
46 CHECK(!tsd_key_inited);
47 tsd_key_inited = true;
48 CHECK_EQ(0, pthread_key_create(&tsd_key, destructor));
52 CHECK(tsd_key_inited);
53 return pthread_getspecific(tsd_key);
56 void AsanTSDSet(void *tsd) {
57 CHECK(tsd_key_inited);
58 pthread_setspecific(tsd_key, tsd);
61 void PlatformTSDDtor(void *tsd) {
62 AsanThreadContext *context = (AsanThreadContext*)tsd;
63 if (context->destructor_iterations > 1) {
64 context->destructor_iterations--;
65 CHECK_EQ(0, pthread_setspecific(tsd_key, tsd));
68 AsanThread::TSDDtor(tsd);
72 #endif // SANITIZER_POSIX