//===-- esan_sideline.h -----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file is a part of EfficiencySanitizer, a family of performance tuners.
//
// Esan sideline thread support.
//===----------------------------------------------------------------------===//

#ifndef ESAN_SIDELINE_H
#define ESAN_SIDELINE_H

#include "sanitizer_common/sanitizer_atomic.h"
#include "sanitizer_common/sanitizer_internal_defs.h"
#include "sanitizer_common/sanitizer_platform_limits_posix.h"

namespace __esan {

typedef void (*SidelineFunc)(void *Arg);

// Currently only one sideline thread is supported.
// It calls the SidelineFunc passed to launchThread once on each sample at the
// given frequency in real time (i.e., wall clock time).
class SidelineThread {
public:
  // We cannot initialize any fields in the constructor as it will be called
  // *after* launchThread for a static instance, as esan.module_ctor is called
  // before static initializers.
  SidelineThread() {}
  ~SidelineThread() {}

  // To simplify declaration in sanitizer code where we want to avoid
  // heap allocations, the constructor and destructor do nothing and
  // launchThread and joinThread do the real work.
  // They should each be called just once.
  bool launchThread(SidelineFunc takeSample, void *Arg, u32 FreqMilliSec);
  bool joinThread();

  // Must be called from the sideline thread itself.
  bool adjustTimer(u32 FreqMilliSec);

private:
  static int runSideline(void *Arg);
  static void registerSignal(int SigNum);
  static void handleSidelineSignal(int SigNum, __sanitizer_siginfo *SigInfo,
                                   void *Ctx);

  char *Stack;
  SidelineFunc sampleFunc;
  void *FuncArg;
  u32 Freq;
  uptr SidelineId;
  atomic_uintptr_t SidelineExit;
};

} // namespace __esan

#endif  // ESAN_SIDELINE_H
