1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- //===-- 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 <pthread.h>
- namespace __scudo {
- struct ALIGNED(SANITIZER_CACHE_LINE_SIZE) ScudoTSD {
- AllocatorCacheT Cache;
- uptr QuarantineCachePlaceHolder[4];
- void init();
- void commitBack();
- inline bool tryLock() SANITIZER_TRY_ACQUIRE(true, Mutex) {
- if (Mutex.TryLock()) {
- atomic_store_relaxed(&Precedence, 0);
- return true;
- }
- if (atomic_load_relaxed(&Precedence) == 0)
- atomic_store_relaxed(&Precedence, static_cast<uptr>(
- MonotonicNanoTime() >> FIRST_32_SECOND_64(16, 0)));
- return false;
- }
- inline void lock() SANITIZER_ACQUIRE(Mutex) {
- atomic_store_relaxed(&Precedence, 0);
- Mutex.Lock();
- }
- inline void unlock() SANITIZER_RELEASE(Mutex) { 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_
|