//===-- scudo_tsd.h ---------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// 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(64) ScudoTSD {
  AllocatorCache Cache;
  ScudoPrng Prng;
  uptr QuarantineCachePlaceHolder[4];

  void init(bool Shared);
  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, NanoTime());
    return false;
  }

  INLINE void lock() {
    Mutex.Lock();
    atomic_store_relaxed(&Precedence, 0);
  }

  INLINE void unlock() {
    if (!UnlockRequired)
      return;
    Mutex.Unlock();
  }

  INLINE u64 getPrecedence() {
    return atomic_load_relaxed(&Precedence);
  }

 private:
  bool UnlockRequired;
  StaticSpinMutex Mutex;
  atomic_uint64_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_
