//===-- scudo_tsd_shared.inc ------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// Scudo shared TSD fastpath functions implementation. /// //===----------------------------------------------------------------------===// #ifndef SCUDO_TSD_H_ # error "This file must be included inside scudo_tsd.h." #endif // SCUDO_TSD_H_ #if !SCUDO_TSD_EXCLUSIVE extern pthread_key_t PThreadKey; ALWAYS_INLINE ScudoTSD* getCurrentTSD() { #if SANITIZER_ANDROID return reinterpret_cast(*get_android_tls_ptr()); #else return reinterpret_cast(pthread_getspecific(PThreadKey)); #endif // SANITIZER_ANDROID } ALWAYS_INLINE void initThreadMaybe(bool MinimalInit = false) { if (LIKELY(getCurrentTSD())) return; initThread(MinimalInit); } ScudoTSD *getTSDAndLockSlow(); ALWAYS_INLINE ScudoTSD *getTSDAndLock() { ScudoTSD *TSD = getCurrentTSD(); CHECK(TSD && "No TSD associated with the current thread!"); // Try to lock the currently associated context. if (TSD->tryLock()) return TSD; // If it failed, go the slow path. return getTSDAndLockSlow(); } #endif // !SCUDO_TSD_EXCLUSIVE