diff options
Diffstat (limited to 'compiler-rt/lib/msan/msan_linux.cc')
| -rw-r--r-- | compiler-rt/lib/msan/msan_linux.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/msan_linux.cc b/compiler-rt/lib/msan/msan_linux.cc index a7a1c160be5..9a40279293d 100644 --- a/compiler-rt/lib/msan/msan_linux.cc +++ b/compiler-rt/lib/msan/msan_linux.cc @@ -16,9 +16,11 @@ #if SANITIZER_LINUX #include "msan.h" +#include "msan_thread.h" #include <elf.h> #include <link.h> +#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -97,6 +99,36 @@ void InstallAtExitHandler() { atexit(MsanAtExit); } +// ---------------------- TSD ---------------- {{{1 + +static pthread_key_t tsd_key; +static bool tsd_key_inited = false; +void MsanTSDInit(void (*destructor)(void *tsd)) { + CHECK(!tsd_key_inited); + tsd_key_inited = true; + CHECK_EQ(0, pthread_key_create(&tsd_key, destructor)); +} + +void *MsanTSDGet() { + CHECK(tsd_key_inited); + return pthread_getspecific(tsd_key); +} + +void MsanTSDSet(void *tsd) { + CHECK(tsd_key_inited); + pthread_setspecific(tsd_key, tsd); +} + +void MsanTSDDtor(void *tsd) { + MsanThread *t = (MsanThread*)tsd; + if (t->destructor_iterations_ > 1) { + t->destructor_iterations_--; + CHECK_EQ(0, pthread_setspecific(tsd_key, tsd)); + return; + } + MsanThread::TSDDtor(tsd); +} + } // namespace __msan #endif // __linux__ |

