Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / trace_viewer / tracing / importer / linux_perf / power_parser.js
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.
4
5 'use strict';
6
7 /**
8  * @fileoverview Parses power events in the Linux event trace format.
9  */
10 tvcm.require('tracing.importer.linux_perf.parser');
11 tvcm.require('tracing.trace_model.counter_series');
12
13 tvcm.exportTo('tracing.importer.linux_perf', function() {
14
15   var Parser = tracing.importer.linux_perf.Parser;
16
17   /**
18    * Parses linux power trace events.
19    * @constructor
20    */
21   function PowerParser(importer) {
22     Parser.call(this, importer);
23
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));
29
30     importer.registerEventHandler('cpu_frequency',
31         PowerParser.prototype.cpuFrequencyEvent.bind(this));
32     importer.registerEventHandler('cpu_idle',
33         PowerParser.prototype.cpuIdleEvent.bind(this));
34   }
35
36   PowerParser.prototype = {
37     __proto__: Parser.prototype,
38
39     cpuStateSlice: function(ts, targetCpuNumber, eventType, cpuState) {
40       var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
41       var powerCounter;
42       if (eventType != '1') {
43         this.importer.model.importWarning({
44           type: 'parse_error',
45           message: 'Don\'t understand power_start events of ' +
46               'type ' + eventType
47         });
48         return;
49       }
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')));
54       }
55       powerCounter.series.forEach(function(series) {
56         series.addCounterSample(ts, cpuState);
57       });
58     },
59
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)));
66       }
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);
71       });
72     },
73
74     cpuFrequencySlice: function(ts, targetCpuNumber, powerState) {
75       var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
76       var powerCounter =
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')));
81       }
82       powerCounter.series.forEach(function(series) {
83         series.addCounterSample(ts, powerState);
84       });
85     },
86
87     /**
88      * Parses power events and sets up state in the importer.
89      */
90     powerStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
91       var event = /type=(\d+) state=(\d) cpu_id=(\d)+/.exec(eventBase.details);
92       if (!event)
93         return false;
94
95       var targetCpuNumber = parseInt(event[3]);
96       var cpuState = parseInt(event[2]);
97       this.cpuStateSlice(ts, targetCpuNumber, event[1], cpuState);
98       return true;
99     },
100
101     powerFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
102       var event = /type=(\d+) state=(\d+) cpu_id=(\d)+/
103           .exec(eventBase.details);
104       if (!event)
105         return false;
106
107       var targetCpuNumber = parseInt(event[3]);
108       var powerState = parseInt(event[2]);
109       this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
110       return true;
111     },
112
113     cpuFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
114       var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
115       if (!event)
116         return false;
117
118       var targetCpuNumber = parseInt(event[2]);
119       var powerState = parseInt(event[1]);
120       this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
121       return true;
122     },
123
124     cpuIdleEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
125       var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
126       if (!event)
127         return false;
128
129       var targetCpuNumber = parseInt(event[2]);
130       var cpuState = parseInt(event[1]);
131       this.cpuIdleSlice(ts, targetCpuNumber, cpuState);
132       return true;
133     }
134   };
135
136   Parser.registerSubtype(PowerParser);
137
138   return {
139     PowerParser: PowerParser
140   };
141 });