1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 * @fileoverview Parses power events in the Linux event trace format.
10 tvcm.require('tracing.importer.linux_perf.parser');
11 tvcm.require('tracing.trace_model.counter_series');
13 tvcm.exportTo('tracing.importer.linux_perf', function() {
15 var Parser = tracing.importer.linux_perf.Parser;
18 * Parses linux power trace events.
21 function PowerParser(importer) {
22 Parser.call(this, importer);
24 // NB: old-style power events, deprecated
25 importer.registerEventHandler('power_start',
26 PowerParser.prototype.powerStartEvent.bind(this));
27 importer.registerEventHandler('power_frequency',
28 PowerParser.prototype.powerFrequencyEvent.bind(this));
30 importer.registerEventHandler('cpu_frequency',
31 PowerParser.prototype.cpuFrequencyEvent.bind(this));
32 importer.registerEventHandler('cpu_idle',
33 PowerParser.prototype.cpuIdleEvent.bind(this));
36 PowerParser.prototype = {
37 __proto__: Parser.prototype,
39 cpuStateSlice: function(ts, targetCpuNumber, eventType, cpuState) {
40 var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
42 if (eventType != '1') {
43 this.importer.model.importWarning({
45 message: 'Don\'t understand power_start events of ' +
50 powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
51 if (powerCounter.numSeries === 0) {
52 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
53 tvcm.ui.getStringColorId(powerCounter.name + '.' + 'state')));
55 powerCounter.series.forEach(function(series) {
56 series.addCounterSample(ts, cpuState);
60 cpuIdleSlice: function(ts, targetCpuNumber, cpuState) {
61 var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
62 var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
63 if (powerCounter.numSeries === 0) {
64 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
65 tvcm.ui.getStringColorId(powerCounter.name)));
67 // NB: 4294967295/-1 means an exit from the current state
68 var val = (cpuState != 4294967295 ? cpuState : 0);
69 powerCounter.series.forEach(function(series) {
70 series.addCounterSample(ts, val);
74 cpuFrequencySlice: function(ts, targetCpuNumber, powerState) {
75 var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
77 targetCpu.cpu.getOrCreateCounter('', 'Clock Frequency');
78 if (powerCounter.numSeries === 0) {
79 powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
80 tvcm.ui.getStringColorId(powerCounter.name + '.' + 'state')));
82 powerCounter.series.forEach(function(series) {
83 series.addCounterSample(ts, powerState);
88 * Parses power events and sets up state in the importer.
90 powerStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
91 var event = /type=(\d+) state=(\d) cpu_id=(\d)+/.exec(eventBase.details);
95 var targetCpuNumber = parseInt(event[3]);
96 var cpuState = parseInt(event[2]);
97 this.cpuStateSlice(ts, targetCpuNumber, event[1], cpuState);
101 powerFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
102 var event = /type=(\d+) state=(\d+) cpu_id=(\d)+/
103 .exec(eventBase.details);
107 var targetCpuNumber = parseInt(event[3]);
108 var powerState = parseInt(event[2]);
109 this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
113 cpuFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
114 var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
118 var targetCpuNumber = parseInt(event[2]);
119 var powerState = parseInt(event[1]);
120 this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
124 cpuIdleEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
125 var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
129 var targetCpuNumber = parseInt(event[2]);
130 var cpuState = parseInt(event[1]);
131 this.cpuIdleSlice(ts, targetCpuNumber, cpuState);
136 Parser.registerSubtype(PowerParser);
139 PowerParser: PowerParser