3 Copyright (c) 2012 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="import" href="/tracing/importer/linux_perf/parser.html">
9 <link rel="import" href="/tracing/trace_model/counter_series.html">
15 * @fileoverview Parses power events in the Linux event trace format.
17 tv.exportTo('tracing.importer.linux_perf', function() {
19 var Parser = tracing.importer.linux_perf.Parser;
22 * Parses linux power trace events.
25 function PowerParser(importer) {
26 Parser.call(this, importer);
28 // NB: old-style power events, deprecated
29 importer.registerEventHandler('power_start',
30 PowerParser.prototype.powerStartEvent.bind(this));
31 importer.registerEventHandler('power_frequency',
32 PowerParser.prototype.powerFrequencyEvent.bind(this));
34 importer.registerEventHandler('cpu_frequency',
35 PowerParser.prototype.cpuFrequencyEvent.bind(this));
36 importer.registerEventHandler('cpu_idle',
37 PowerParser.prototype.cpuIdleEvent.bind(this));
40 PowerParser.prototype = {
41 __proto__: Parser.prototype,
43 cpuStateSlice: function(ts, targetCpuNumber, eventType, cpuState) {
44 var targetCpu = this.importer.getOrCreateCpu(targetCpuNumber);
46 if (eventType != '1') {
47 this.importer.model.importWarning({
49 message: 'Don\'t understand power_start events of ' +
54 powerCounter = targetCpu.getOrCreateCounter('', 'C-State');
55 if (powerCounter.numSeries === 0) {
56 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
57 tv.ui.getStringColorId(powerCounter.name + '.' + 'state')));
59 powerCounter.series.forEach(function(series) {
60 series.addCounterSample(ts, cpuState);
64 cpuIdleSlice: function(ts, targetCpuNumber, cpuState) {
65 var targetCpu = this.importer.getOrCreateCpu(targetCpuNumber);
66 var powerCounter = targetCpu.getOrCreateCounter('', 'C-State');
67 if (powerCounter.numSeries === 0) {
68 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
69 tv.ui.getStringColorId(powerCounter.name)));
71 // NB: 4294967295/-1 means an exit from the current state
72 var val = (cpuState != 4294967295 ? cpuState : 0);
73 powerCounter.series.forEach(function(series) {
74 series.addCounterSample(ts, val);
78 cpuFrequencySlice: function(ts, targetCpuNumber, powerState) {
79 var targetCpu = this.importer.getOrCreateCpu(targetCpuNumber);
81 targetCpu.getOrCreateCounter('', 'Clock Frequency');
82 if (powerCounter.numSeries === 0) {
83 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
84 tv.ui.getStringColorId(powerCounter.name + '.' + 'state')));
86 powerCounter.series.forEach(function(series) {
87 series.addCounterSample(ts, powerState);
92 * Parses power events and sets up state in the importer.
94 powerStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
95 var event = /type=(\d+) state=(\d) cpu_id=(\d)+/.exec(eventBase.details);
99 var targetCpuNumber = parseInt(event[3]);
100 var cpuState = parseInt(event[2]);
101 this.cpuStateSlice(ts, targetCpuNumber, event[1], cpuState);
105 powerFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
106 var event = /type=(\d+) state=(\d+) cpu_id=(\d)+/
107 .exec(eventBase.details);
111 var targetCpuNumber = parseInt(event[3]);
112 var powerState = parseInt(event[2]);
113 this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
117 cpuFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
118 var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
122 var targetCpuNumber = parseInt(event[2]);
123 var powerState = parseInt(event[1]);
124 this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
128 cpuIdleEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
129 var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
133 var targetCpuNumber = parseInt(event[2]);
134 var cpuState = parseInt(event[1]);
135 this.cpuIdleSlice(ts, targetCpuNumber, cpuState);
140 Parser.registerSubtype(PowerParser);
143 PowerParser: PowerParser