diff options
author | Josh Stone <jistone@redhat.com> | 2010-03-16 16:53:48 -0700 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2010-03-17 12:30:15 -0700 |
commit | a3cf75e6d0d589ab0922ccb0cecae6cdc480ecde (patch) | |
tree | 437f5f8d6d5cee52ff5f859ef139e530e1a20e7b /tapset-perfmon.cxx | |
parent | 4763f7139043dccebdc110fe1d8912670c528c70 (diff) | |
download | systemtap-steved-a3cf75e6d0d589ab0922ccb0cecae6cdc480ecde.tar.gz systemtap-steved-a3cf75e6d0d589ab0922ccb0cecae6cdc480ecde.tar.xz systemtap-steved-a3cf75e6d0d589ab0922ccb0cecae6cdc480ecde.zip |
Rename perf probe points
These are now the available points:
perf.event("NAME")
perf.event("NAME").sample(NUM)
* tapset-perfmon.cxx (perf_derived_probe::perf_derived_probe): Add
fields for the event name, type, and config. Rewrite the probe_point
to match the derived components
(perf_builder::build): Parse the new fields.
(register_tapset_perf): Adapt the match_nodes.
Diffstat (limited to 'tapset-perfmon.cxx')
-rw-r--r-- | tapset-perfmon.cxx | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/tapset-perfmon.cxx b/tapset-perfmon.cxx index b920b51d..a9f9f440 100644 --- a/tapset-perfmon.cxx +++ b/tapset-perfmon.cxx @@ -20,6 +20,8 @@ using namespace __gnu_cxx; static const string TOK_PERF("perf"); +static const string TOK_EVENT("event"); +static const string TOK_SAMPLE("sample"); // ------------------------------------------------------------------------ @@ -30,16 +32,18 @@ static const string TOK_PERF("perf"); struct perf_derived_probe: public derived_probe { + string event_name; + string event_type; + string event_config; int64_t interval; - perf_derived_probe (probe* p, probe_point* l, int64_t i); + perf_derived_probe (probe* p, probe_point* l, const string& name, + const string& type, const string& config, int64_t i); virtual void join_group (systemtap_session& s); }; struct perf_derived_probe_group: public generic_dpg<perf_derived_probe> { - void emit_interval (translator_output* o); -public: void emit_module_decls (systemtap_session& s); void emit_module_init (systemtap_session& s); void emit_module_exit (systemtap_session& s); @@ -47,9 +51,18 @@ public: perf_derived_probe::perf_derived_probe (probe* p, probe_point* l, - int64_t i): - derived_probe (p, l), interval (i) + const string& name, + const string& type, + const string& config, + int64_t i): + derived_probe (p, new probe_point(*l) /* .components soon rewritten */), + event_name (name), event_type (type), event_config (config), interval (i) { + vector<probe_point::component*>& comps = this->sole_location()->components; + comps.clear(); + comps.push_back (new probe_point::component (TOK_PERF)); + comps.push_back (new probe_point::component (TOK_EVENT, new literal_string (event_name))); + comps.push_back (new probe_point::component (TOK_SAMPLE, new literal_number (interval))); } @@ -63,11 +76,6 @@ perf_derived_probe::join_group (systemtap_session& s) void -perf_derived_probe_group::emit_interval (translator_output* o) -{ -} - -void perf_derived_probe_group::emit_module_decls (systemtap_session& s) { if (probes.empty()) return; @@ -77,6 +85,7 @@ perf_derived_probe_group::emit_module_decls (systemtap_session& s) /* declarations */ for (unsigned i=0; i < probes.size(); i++) { + // TODO create Perf data structures } s.op->newline(); @@ -149,15 +158,21 @@ perf_builder::build(systemtap_session & sess, literal_map_t const & parameters, vector<derived_probe *> & finished_results) { + string name, type, config; + bool has_name = get_param(parameters, TOK_EVENT, name); + assert(has_name); + + // TODO translate event name to a type and config + type = "PERF_TYPE_HARDWARE"; + config = "PERF_COUNT_HW_CPU_CYCLES"; + int64_t period; - /* FIXME */ - if (get_param(parameters, "cycles", period)) - { - } - else - throw semantic_error ("unrecognized perf variant"); + bool has_period = get_param(parameters, TOK_SAMPLE, period); + if (!has_period) + period = 1000000; + finished_results.push_back - (new perf_derived_probe(base, location, period)); + (new perf_derived_probe(base, location, name, type, config, period)); } @@ -169,13 +184,12 @@ register_tapset_perf(systemtap_session& s) if (s.kernel_config["CONFIG_PERF_EVENTS"] != "y") return; - match_node* root = s.pattern_root; derived_probe_builder *builder = new perf_builder(); + match_node* perf = s.pattern_root->bind(TOK_PERF); - root = root->bind(TOK_PERF); - - root->bind_num("cycles") - ->bind(builder); + match_node* event = perf->bind_str(TOK_EVENT); + event->bind(builder); + event->bind_num(TOK_SAMPLE)->bind(builder); } /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */ |