//===-- dfsan_thread.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
//
//===----------------------------------------------------------------------===//
//
// This file is a part of DataFlowSanitizer.
//
//===----------------------------------------------------------------------===//

#ifndef DFSAN_THREAD_H
#define DFSAN_THREAD_H

#include "dfsan_allocator.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_posix.h"

namespace __dfsan {

class DFsanThread {
 public:
  // NOTE: There is no DFsanThread constructor. It is allocated
  // via mmap() and *must* be valid in zero-initialized state.

  static DFsanThread *Create(void *start_routine_trampoline,
                             thread_callback_t start_routine, void *arg,
                             bool track_origins = false);
  static void TSDDtor(void *tsd);
  void Destroy();

  void Init();  // Should be called from the thread itself.
  thread_return_t ThreadStart();

  uptr stack_top();
  uptr stack_bottom();
  uptr tls_begin() { return tls_begin_; }
  uptr tls_end() { return tls_end_; }
  bool IsMainThread() { return start_routine_ == nullptr; }

  bool InSignalHandler() { return in_signal_handler_; }
  void EnterSignalHandler() { in_signal_handler_++; }
  void LeaveSignalHandler() { in_signal_handler_--; }

  DFsanThreadLocalMallocStorage &malloc_storage() { return malloc_storage_; }

  int destructor_iterations_;
  __sanitizer_sigset_t starting_sigset_;

 private:
  void SetThreadStackAndTls();
  void ClearShadowForThreadStackAndTLS();
  struct StackBounds {
    uptr bottom;
    uptr top;
  };
  StackBounds GetStackBounds() const;

  bool AddrIsInStack(uptr addr);

  void *start_routine_trampoline_;
  thread_callback_t start_routine_;
  void *arg_;
  bool track_origins_;

  StackBounds stack_;

  uptr tls_begin_;
  uptr tls_end_;

  unsigned in_signal_handler_;

  DFsanThreadLocalMallocStorage malloc_storage_;
};

DFsanThread *GetCurrentThread();
void SetCurrentThread(DFsanThread *t);
void DFsanTSDInit(void (*destructor)(void *tsd));
void DFsanTSDDtor(void *tsd);

}  // namespace __dfsan

#endif  // DFSAN_THREAD_H
