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