Index: lib/asan/asan_posix.cc =================================================================== --- lib/asan/asan_posix.cc +++ lib/asan/asan_posix.cc @@ -40,29 +40,47 @@ // ---------------------- TSD ---------------- {{{1 +#if SANITIZER_FREEBSD +static void *_tsd = nullptr; +#else static pthread_key_t tsd_key; +#endif static bool tsd_key_inited = false; void AsanTSDInit(void (*destructor)(void *tsd)) { CHECK(!tsd_key_inited); tsd_key_inited = true; +#if !SANITIZER_FREEBSD CHECK_EQ(0, pthread_key_create(&tsd_key, destructor)); +#endif } void *AsanTSDGet() { CHECK(tsd_key_inited); +#if SANITIZER_FREEBSD + return _tsd; +#else return pthread_getspecific(tsd_key); +#endif } void AsanTSDSet(void *tsd) { CHECK(tsd_key_inited); +#if SANITIZER_FREEBSD + _tsd = tsd; +#else pthread_setspecific(tsd_key, tsd); +#endif } void PlatformTSDDtor(void *tsd) { AsanThreadContext *context = (AsanThreadContext*)tsd; if (context->destructor_iterations > 1) { context->destructor_iterations--; +#if SANITIZER_FREEBSD + _tsd = tsd; +#else CHECK_EQ(0, pthread_setspecific(tsd_key, tsd)); +#endif return; } AsanThread::TSDDtor(tsd);