Index: lib/asan/asan_posix.cc =================================================================== --- lib/asan/asan_posix.cc +++ lib/asan/asan_posix.cc @@ -40,31 +40,43 @@ // ---------------------- TSD ---------------- {{{1 -static pthread_key_t tsd_key; +static __thread void *tsd_data; +static __thread void (*tsd_dst)(void *tsd) = nullptr; static bool tsd_key_inited = false; + +void AsanTSDExit(void) { + AsanThreadContext *context = (AsanThreadContext *)tsd_data; + if (context->destructor_iterations > 1) { + context->destructor_iterations--; + return; + } + + if (tsd_dst) + tsd_dst(tsd_data); +} + void AsanTSDInit(void (*destructor)(void *tsd)) { CHECK(!tsd_key_inited); tsd_key_inited = true; - CHECK_EQ(0, pthread_key_create(&tsd_key, destructor)); + size_t dit = GetPthreadDestructorIterations(); + for (size_t i = 0; i < dit; i ++) + Atexit(AsanTSDExit); + tsd_data = nullptr; + tsd_dst = destructor; + } void *AsanTSDGet() { CHECK(tsd_key_inited); - return pthread_getspecific(tsd_key); + return tsd_data; } void AsanTSDSet(void *tsd) { CHECK(tsd_key_inited); - pthread_setspecific(tsd_key, tsd); + tsd_data = tsd; } void PlatformTSDDtor(void *tsd) { - AsanThreadContext *context = (AsanThreadContext*)tsd; - if (context->destructor_iterations > 1) { - context->destructor_iterations--; - CHECK_EQ(0, pthread_setspecific(tsd_key, tsd)); - return; - } AsanThread::TSDDtor(tsd); } } // namespace __asan