1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
// task finder for user tapsets
// Copyright (C) 2005-2009 Red Hat Inc.
// Copyright (C) 2005-2007 Intel Corporation.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
// Public License (GPL); either version 2, or (at your option) any
// later version.
#include "session.h"
#include "tapsets.h"
#include "task_finder.h"
#include "translate.h"
#include "util.h"
#include <cstring>
#include <string>
using namespace std;
using namespace __gnu_cxx;
// ------------------------------------------------------------------------
// task_finder and vma tracker derived 'probes': These don't really exist.
// The purpose of these is to ensure that _stp_vma_init()/_stp_vma_done()
// and stap_start_task_finder()/stap_stop_task_finder() get called only
// once and in the right place.
// ------------------------------------------------------------------------
struct task_finder_derived_probe: public derived_probe
{
// Dummy constructor for gcc 3.4 compatibility
task_finder_derived_probe (): derived_probe (0, 0) { assert(0); }
};
struct vma_tracker_derived_probe: public derived_probe
{
// Dummy constructor for gcc 3.4 compatibility
vma_tracker_derived_probe (): derived_probe (0, 0) { assert(0); }
};
struct task_finder_derived_probe_group: public generic_dpg<task_finder_derived_probe>
{
public:
void emit_module_decls (systemtap_session& ) { }
void emit_module_init (systemtap_session& s);
void emit_module_post_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
};
struct vma_tracker_derived_probe_group: public generic_dpg<vma_tracker_derived_probe>
{
public:
void emit_module_decls (systemtap_session& ) { }
void emit_module_init (systemtap_session& s);
void emit_module_exit (systemtap_session& s);
};
void
task_finder_derived_probe_group::emit_module_init (systemtap_session& s)
{
s.op->newline();
s.op->newline() << "/* ---- task finder ---- */";
s.op->newline() << "rc = stap_start_task_finder();";
}
void
task_finder_derived_probe_group::emit_module_post_init (systemtap_session& s)
{
s.op->newline() << "/* ---- task finder ---- */";
s.op->newline() << "stap_task_finder_post_init();";
}
void
task_finder_derived_probe_group::emit_module_exit (systemtap_session& s)
{
s.op->newline();
s.op->newline() << "/* ---- task finder ---- */";
s.op->newline() << "stap_stop_task_finder();";
}
void
vma_tracker_derived_probe_group::emit_module_init (systemtap_session& s)
{
s.op->newline();
s.op->newline() << "/* ---- vma tracker ---- */";
s.op->newline() << "rc = _stp_vma_init();";
}
void
vma_tracker_derived_probe_group::emit_module_exit (systemtap_session& s)
{
s.op->newline();
s.op->newline() << "/* ---- vma tracker ---- */";
s.op->newline() << "_stp_vma_done();";
}
// Declare that task_finder is needed in this session
void
enable_task_finder(systemtap_session& s)
{
if (! s.task_finder_derived_probes)
s.task_finder_derived_probes = new task_finder_derived_probe_group();
}
// Declare that vma tracker is needed in this session,
// implies that the task_finder is needed.
void
enable_vma_tracker(systemtap_session& s)
{
enable_task_finder(s);
if (! s.vma_tracker_derived_probes)
s.vma_tracker_derived_probes = new vma_tracker_derived_probe_group();
}
// Whether the vma tracker is needed in this session.
bool
vma_tracker_enabled(systemtap_session& s)
{
return s.vma_tracker_derived_probes;
}
/* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */
|