Index: lib/scudo/scudo_allocator.cpp =================================================================== --- lib/scudo/scudo_allocator.cpp +++ lib/scudo/scudo_allocator.cpp @@ -22,9 +22,9 @@ #include "sanitizer_common/sanitizer_allocator_checks.h" #include "sanitizer_common/sanitizer_allocator_interface.h" -#include "sanitizer_common/sanitizer_errno.h" #include "sanitizer_common/sanitizer_quarantine.h" +#include #include namespace __scudo { @@ -640,7 +640,7 @@ void *scudoPvalloc(uptr Size) { uptr PageSize = GetPageSizeCached(); if (UNLIKELY(CheckForPvallocOverflow(Size, PageSize))) { - errno = errno_ENOMEM; + errno = ENOMEM; return Instance.handleBadRequest(); } // pvalloc(0) should allocate one page. @@ -650,7 +650,7 @@ void *scudoMemalign(uptr Alignment, uptr Size) { if (UNLIKELY(!IsPowerOfTwo(Alignment))) { - errno = errno_EINVAL; + errno = EINVAL; return Instance.handleBadRequest(); } return SetErrnoOnNull(Instance.allocate(Size, Alignment, FromMemalign)); @@ -659,18 +659,18 @@ int scudoPosixMemalign(void **MemPtr, uptr Alignment, uptr Size) { if (UNLIKELY(!CheckPosixMemalignAlignment(Alignment))) { Instance.handleBadRequest(); - return errno_EINVAL; + return EINVAL; } void *Ptr = Instance.allocate(Size, Alignment, FromMemalign); if (UNLIKELY(!Ptr)) - return errno_ENOMEM; + return ENOMEM; *MemPtr = Ptr; return 0; } void *scudoAlignedAlloc(uptr Alignment, uptr Size) { if (UNLIKELY(!CheckAlignedAllocAlignmentAndSize(Alignment, Size))) { - errno = errno_EINVAL; + errno = EINVAL; return Instance.handleBadRequest(); } return SetErrnoOnNull(Instance.allocate(Size, Alignment, FromMalloc)); Index: lib/scudo/scudo_tsd.h =================================================================== --- lib/scudo/scudo_tsd.h +++ lib/scudo/scudo_tsd.h @@ -19,6 +19,8 @@ #include "scudo_allocator.h" #include "scudo_utils.h" +#include + namespace __scudo { struct ALIGNED(64) ScudoTSD { Index: lib/scudo/scudo_tsd_exclusive.cpp =================================================================== --- lib/scudo/scudo_tsd_exclusive.cpp +++ lib/scudo/scudo_tsd_exclusive.cpp @@ -15,8 +15,6 @@ #if SCUDO_TSD_EXCLUSIVE -#include - namespace __scudo { static pthread_once_t GlobalInitialized = PTHREAD_ONCE_INIT; Index: lib/scudo/scudo_tsd_shared.cpp =================================================================== --- lib/scudo/scudo_tsd_shared.cpp +++ lib/scudo/scudo_tsd_shared.cpp @@ -15,8 +15,6 @@ #if !SCUDO_TSD_EXCLUSIVE -#include - namespace __scudo { static pthread_once_t GlobalInitialized = PTHREAD_ONCE_INIT; @@ -51,12 +49,15 @@ TSDs[i].init(/*Shared=*/true); } +ALWAYS_INLINE void setCurrentTSD(ScudoTSD *TSD) { + *get_android_tls_ptr() = reinterpret_cast(TSD); +} + void initThread(bool MinimalInit) { pthread_once(&GlobalInitialized, initOnce); // Initial context assignment is done in a plain round-robin fashion. u32 Index = atomic_fetch_add(&CurrentIndex, 1, memory_order_relaxed); - ScudoTSD *TSD = &TSDs[Index % NumberOfTSDs]; - *get_android_tls_ptr() = reinterpret_cast(TSD); + setCurrentTSD(&TSDs[Index % NumberOfTSDs]); } ScudoTSD *getTSDAndLockSlow() { @@ -66,7 +67,7 @@ for (u32 i = 0; i < NumberOfTSDs; i++) { TSD = &TSDs[i]; if (TSD->tryLock()) { - *get_android_tls_ptr() = reinterpret_cast(TSD); + setCurrentTSD(TSD); return TSD; } } @@ -81,12 +82,12 @@ } if (LIKELY(LowestPrecedence != UINT64_MAX)) { TSD->lock(); - *get_android_tls_ptr() = reinterpret_cast(TSD); + setCurrentTSD(TSD); return TSD; } } // Last resort, stick with the current one. - TSD = reinterpret_cast(*get_android_tls_ptr()); + TSD = getCurrentTSD(); TSD->lock(); return TSD; } Index: lib/scudo/scudo_tsd_shared.inc =================================================================== --- lib/scudo/scudo_tsd_shared.inc +++ lib/scudo/scudo_tsd_shared.inc @@ -17,8 +17,12 @@ #if !SCUDO_TSD_EXCLUSIVE +ALWAYS_INLINE ScudoTSD* getCurrentTSD() { + return reinterpret_cast(*get_android_tls_ptr()); +} + ALWAYS_INLINE void initThreadMaybe(bool MinimalInit = false) { - if (LIKELY(*get_android_tls_ptr())) + if (LIKELY(getCurrentTSD())) return; initThread(MinimalInit); } @@ -26,7 +30,7 @@ ScudoTSD *getTSDAndLockSlow(); ALWAYS_INLINE ScudoTSD *getTSDAndLock() { - ScudoTSD *TSD = reinterpret_cast(*get_android_tls_ptr()); + ScudoTSD *TSD = getCurrentTSD(); CHECK(TSD && "No TSD associated with the current thread!"); // Try to lock the currently associated context. if (TSD->tryLock())