//===-- 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_
