• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
10base.require('tracing.importer.linux_perf.parser');
11base.require('tracing.trace_model.counter_series');
12
13base.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.importError('Don\'t understand power_start events of ' +
44            'type ' + eventType);
45        return;
46      }
47      powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
48      if (powerCounter.numSeries === 0) {
49        powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
50            tracing.getStringColorId(powerCounter.name + '.' + 'state')));
51      }
52      powerCounter.series.forEach(function(series) {
53        series.addSample(ts, cpuState);
54      });
55    },
56
57    cpuIdleSlice: function(ts, targetCpuNumber, cpuState) {
58      var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
59      var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State');
60      if (powerCounter.numSeries === 0) {
61        powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
62            tracing.getStringColorId(powerCounter.name)));
63      }
64      // NB: 4294967295/-1 means an exit from the current state
65      var val = (cpuState != 4294967295 ? cpuState + 1 : 0);
66      powerCounter.series.forEach(function(series) {
67        series.addSample(ts, val);
68      });
69    },
70
71    cpuFrequencySlice: function(ts, targetCpuNumber, powerState) {
72      var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber);
73      var powerCounter =
74          targetCpu.cpu.getOrCreateCounter('', 'Clock Frequency');
75      if (powerCounter.numSeries === 0) {
76        powerCounter.addSeries(new tracing.trace_model.CounterSeries('state',
77            tracing.getStringColorId(powerCounter.name + '.' + 'state')));
78      }
79      powerCounter.series.forEach(function(series) {
80        series.addSample(ts, powerState);
81      });
82    },
83
84    /**
85     * Parses power events and sets up state in the importer.
86     */
87    powerStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
88      var event = /type=(\d+) state=(\d) cpu_id=(\d)+/.exec(eventBase.details);
89      if (!event)
90        return false;
91
92      var targetCpuNumber = parseInt(event[3]);
93      var cpuState = parseInt(event[2]);
94      this.cpuStateSlice(ts, targetCpuNumber, event[1], cpuState);
95      return true;
96    },
97
98    powerFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
99      var event = /type=(\d+) state=(\d+) cpu_id=(\d)+/
100          .exec(eventBase.details);
101      if (!event)
102        return false;
103
104      var targetCpuNumber = parseInt(event[3]);
105      var powerState = parseInt(event[2]);
106      this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
107      return true;
108    },
109
110    cpuFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
111      var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
112      if (!event)
113        return false;
114
115      var targetCpuNumber = parseInt(event[2]);
116      var powerState = parseInt(event[1]);
117      this.cpuFrequencySlice(ts, targetCpuNumber, powerState);
118      return true;
119    },
120
121    cpuIdleEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
122      var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase.details);
123      if (!event)
124        return false;
125
126      var targetCpuNumber = parseInt(event[2]);
127      var cpuState = parseInt(event[1]);
128      this.cpuIdleSlice(ts, targetCpuNumber, cpuState);
129      return true;
130    }
131  };
132
133  Parser.registerSubtype(PowerParser);
134
135  return {
136    PowerParser: PowerParser
137  };
138});
139