//===-- scudo_tls_context_android.inc ---------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// Android specific base thread context definition. /// //===----------------------------------------------------------------------===// #ifndef SCUDO_TLS_CONTEXT_ANDROID_INC_ #define SCUDO_TLS_CONTEXT_ANDROID_INC_ #ifndef SCUDO_TLS_H_ # error "This file must be included inside scudo_tls.h." #endif // SCUDO_TLS_H_ #if SANITIZER_LINUX && SANITIZER_ANDROID struct ScudoThreadContextPlatform { INLINE bool tryLock() { if (Mutex.TryLock()) { atomic_store_relaxed(&SlowLockPrecedence, 0); return true; } if (atomic_load_relaxed(&SlowLockPrecedence) == 0) atomic_store_relaxed(&SlowLockPrecedence, NanoTime()); return false; } INLINE void lock() { Mutex.Lock(); atomic_store_relaxed(&SlowLockPrecedence, 0); } INLINE void unlock() { Mutex.Unlock(); } INLINE u64 getSlowLockPrecedence() { return atomic_load_relaxed(&SlowLockPrecedence); } private: StaticSpinMutex Mutex; atomic_uint64_t SlowLockPrecedence; }; #endif // SANITIZER_LINUX && SANITIZER_ANDROID #endif // SCUDO_TLS_CONTEXT_ANDROID_INC_