power_parser.js revision 66a37686207944273ced825e0e8b6b6375f8c3de
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.exportTo('tracing.importer.linux_perf', function() { 12 13 var Parser = tracing.importer.linux_perf.Parser; 14 15 /** 16 * Parses linux power trace events. 17 * @constructor 18 */ 19 function PowerParser(importer) { 20 Parser.call(this, importer); 21 22 // NB: old-style power events, deprecated 23 importer.registerEventHandler('power_start', 24 PowerParser.prototype.powerStartEvent.bind(this)); 25 importer.registerEventHandler('power_frequency', 26 PowerParser.prototype.powerFrequencyEvent.bind(this)); 27 28 importer.registerEventHandler('cpu_frequency', 29 PowerParser.prototype.cpuFrequencyEvent.bind(this)); 30 importer.registerEventHandler('cpu_idle', 31 PowerParser.prototype.cpuIdleEvent.bind(this)); 32 } 33 34 PowerParser.prototype = { 35 __proto__: Parser.prototype, 36 37 cpuStateSlice: function(ts, targetCpuNumber, eventType, cpuState) { 38 var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber); 39 var powerCounter; 40 if (eventType != '1') { 41 this.importer.importError('Don\'t understand power_start events of ' + 42 'type ' + eventType); 43 return; 44 } 45 powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State'); 46 if (powerCounter.numSeries == 0) { 47 powerCounter.seriesNames.push('state'); 48 powerCounter.seriesColors.push( 49 tracing.getStringColorId(powerCounter.name + '.' + 'state')); 50 } 51 powerCounter.timestamps.push(ts); 52 powerCounter.samples.push(cpuState); 53 }, 54 55 cpuIdleSlice: function(ts, targetCpuNumber, cpuState) { 56 var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber); 57 var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State'); 58 if (powerCounter.numSeries == 0) { 59 powerCounter.seriesNames.push('state'); 60 powerCounter.seriesColors.push( 61 tracing.getStringColorId(powerCounter.name)); 62 } 63 // NB: 4294967295/-1 means an exit from the current state 64 if (cpuState != 4294967295) 65 powerCounter.samples.push(cpuState); 66 else 67 powerCounter.samples.push(0); 68 powerCounter.timestamps.push(ts); 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.seriesNames.push('state'); 77 powerCounter.seriesColors.push( 78 tracing.getStringColorId(powerCounter.name + '.' + 'state')); 79 } 80 powerCounter.timestamps.push(ts); 81 powerCounter.samples.push(powerState); 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