//===-- scudo_tsd.h ---------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// Scudo thread specific data definition. /// Implementation will differ based on the thread local storage primitives /// offered by the underlying platform. /// //===----------------------------------------------------------------------===// #ifndef SCUDO_TSD_H_ #define SCUDO_TSD_H_ #include "scudo_allocator.h" #include "scudo_utils.h" #include namespace __scudo { struct ALIGNED(SANITIZER_CACHE_LINE_SIZE) ScudoTSD { AllocatorCacheT Cache; uptr QuarantineCachePlaceHolder[4]; void init(); void commitBack(); INLINE bool tryLock() { if (Mutex.TryLock()) { atomic_store_relaxed(&Precedence, 0); return true; } if (atomic_load_relaxed(&Precedence) == 0) atomic_store_relaxed(&Precedence, static_cast( MonotonicNanoTime() >> FIRST_32_SECOND_64(16, 0))); return false; } INLINE void lock() { atomic_store_relaxed(&Precedence, 0); Mutex.Lock(); } INLINE void unlock() { Mutex.Unlock(); } INLINE uptr getPrecedence() { return atomic_load_relaxed(&Precedence); } private: StaticSpinMutex Mutex; atomic_uintptr_t Precedence; }; void initThread(bool MinimalInit); // TSD model specific fastpath functions definitions. #include "scudo_tsd_exclusive.inc" #include "scudo_tsd_shared.inc" } // namespace __scudo #endif // SCUDO_TSD_H_