// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview Parses power events in the Linux event trace format. */ base.require('linux_perf_parser'); base.exportTo('tracing', function() { var LinuxPerfParser = tracing.LinuxPerfParser; /** * Parses linux power trace events. * @constructor */ function LinuxPerfPowerParser(importer) { LinuxPerfParser.call(this, importer); // NB: old-style power events, deprecated importer.registerEventHandler('power_start', LinuxPerfPowerParser.prototype.powerStartEvent.bind(this)); importer.registerEventHandler('power_frequency', LinuxPerfPowerParser.prototype.powerFrequencyEvent.bind(this)); importer.registerEventHandler('cpu_frequency', LinuxPerfPowerParser.prototype.cpuFrequencyEvent.bind(this)); importer.registerEventHandler('cpu_idle', LinuxPerfPowerParser.prototype.cpuIdleEvent.bind(this)); } LinuxPerfPowerParser.prototype = { __proto__: LinuxPerfParser.prototype, cpuStateSlice: function(ts, targetCpuNumber, eventType, cpuState) { var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber); var powerCounter; if (eventType != '1') { this.importer.importError('Don\'t understand power_start events of ' + 'type ' + eventType); return; } powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State'); if (powerCounter.numSeries == 0) { powerCounter.seriesNames.push('state'); powerCounter.seriesColors.push( tracing.getStringColorId(powerCounter.name + '.' + 'state')); } powerCounter.timestamps.push(ts); powerCounter.samples.push(cpuState); }, cpuIdleSlice: function(ts, targetCpuNumber, cpuState) { var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber); var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'C-State'); if (powerCounter.numSeries == 0) { powerCounter.seriesNames.push('state'); powerCounter.seriesColors.push( tracing.getStringColorId(powerCounter.name)); } // NB: 4294967295/-1 means an exit from the current state if (cpuState != 4294967295) powerCounter.samples.push(cpuState); else powerCounter.samples.push(0); powerCounter.timestamps.push(ts); }, cpuFrequencySlice: function(ts, targetCpuNumber, powerState) { var targetCpu = this.importer.getOrCreateCpuState(targetCpuNumber); var powerCounter = targetCpu.cpu.getOrCreateCounter('', 'Clock Frequency'); if (powerCounter.numSeries == 0) { powerCounter.seriesNames.push('state'); powerCounter.seriesColors.push( tracing.getStringColorId(powerCounter.name + '.' + 'state')); } powerCounter.timestamps.push(ts); powerCounter.samples.push(powerState); }, /** * Parses power events and sets up state in the importer. */ powerStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = /type=(\d+) state=(\d) cpu_id=(\d)+/.exec(eventBase[5]); if (!event) return false; var targetCpuNumber = parseInt(event[3]); var cpuState = parseInt(event[2]); this.cpuStateSlice(ts, targetCpuNumber, event[1], cpuState); return true; }, powerFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = /type=(\d+) state=(\d+) cpu_id=(\d)+/ .exec(eventBase[5]); if (!event) return false; var targetCpuNumber = parseInt(event[3]); var powerState = parseInt(event[2]); this.cpuFrequencySlice(ts, targetCpuNumber, powerState); return true; }, cpuFrequencyEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase[5]); if (!event) return false; var targetCpuNumber = parseInt(event[2]); var powerState = parseInt(event[1]); this.cpuFrequencySlice(ts, targetCpuNumber, powerState); return true; }, cpuIdleEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = /state=(\d+) cpu_id=(\d)+/.exec(eventBase[5]); if (!event) return false; var targetCpuNumber = parseInt(event[2]); var cpuState = parseInt(event[1]); this.cpuIdleSlice(ts, targetCpuNumber, cpuState); return true; } }; LinuxPerfParser.registerSubtype(LinuxPerfPowerParser); return { LinuxPerfPowerParser: LinuxPerfPowerParser }; });