Summary: Adds support for creating a separate thread for performing "sideline" actions on a periodic basis via an itimer. A new class SidelineThread implements this feature, exposing a sampling callback to the caller. Adds initial usage of sideline sampling to the working set tool. For now it simply prints the usage at each snapshot at verbosity level 1. Adds a test of this behavior. Adds a new option -record_snapshots to control whether we sample and a new option -sample_freq to control the periodicity of the sampling. Reviewers: aizatsky Subscribers: vitalybuka, zhaoqin, kcc, eugenis, llvm-commits, kubabrecka Differential Revision: http://reviews.llvm.org/D20751 llvm-svn: 271682
62 lines
1.9 KiB
C++
62 lines
1.9 KiB
C++
//===-- 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"
|
|
|
|
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, void *SigInfo, void *Ctx);
|
|
|
|
char *Stack;
|
|
SidelineFunc sampleFunc;
|
|
void *FuncArg;
|
|
u32 Freq;
|
|
uptr SidelineId;
|
|
atomic_uintptr_t SidelineExit;
|
|
};
|
|
|
|
} // namespace __esan
|
|
|
|
#endif // ESAN_SIDELINE_H
|