Files
llvm-project/compiler-rt/lib/esan/esan_sideline.h
Derek Bruening 07814769a8 [esan] Add sideline itimer support
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
2016-06-03 16:14:07 +00:00

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