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 /** 6 * @fileoverview Parses cpufreq events in the Linux event trace format. 7 */ 8 base.require('importer.linux_perf.parser'); 9 base.exportTo('tracing.importer.linux_perf', function() { 10 11 var Parser = tracing.importer.linux_perf.Parser; 12 13 /** 14 * Parses linux cpufreq trace events. 15 * @constructor 16 */ 17 function CpufreqParser(importer) { 18 Parser.call(this, importer); 19 20 importer.registerEventHandler('cpufreq_interactive_up', 21 CpufreqParser.prototype.cpufreqUpDownEvent.bind(this)); 22 importer.registerEventHandler('cpufreq_interactive_down', 23 CpufreqParser.prototype.cpufreqUpDownEvent.bind(this)); 24 importer.registerEventHandler('cpufreq_interactive_already', 25 CpufreqParser.prototype.cpufreqTargetEvent.bind(this)); 26 importer.registerEventHandler('cpufreq_interactive_notyet', 27 CpufreqParser.prototype.cpufreqTargetEvent.bind(this)); 28 importer.registerEventHandler('cpufreq_interactive_setspeed', 29 CpufreqParser.prototype.cpufreqTargetEvent.bind(this)); 30 importer.registerEventHandler('cpufreq_interactive_target', 31 CpufreqParser.prototype.cpufreqTargetEvent.bind(this)); 32 importer.registerEventHandler('cpufreq_interactive_boost', 33 CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this)); 34 importer.registerEventHandler('cpufreq_interactive_unboost', 35 CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this)); 36 } 37 38 function splitData(input) { 39 // TODO(sleffler) split by cpu 40 var data = {}; 41 var args = input.split(/\s+/); 42 var len = args.length; 43 for (var i = 0; i < len; i++) { 44 var item = args[i].split('='); 45 data[item[0]] = parseInt(item[1]); 46 } 47 return data; 48 } 49 50 CpufreqParser.prototype = { 51 __proto__: Parser.prototype, 52 53 cpufreqSlice: function(ts, eventName, cpu, args) { 54 // TODO(sleffler) should be per-cpu 55 var kthread = this.importer.getOrCreatePseudoThread('cpufreq'); 56 kthread.openSlice = eventName; 57 var slice = new tracing.model.Slice('', kthread.openSlice, 58 tracing.getStringColorId(kthread.openSlice), ts, args, 0); 59 60 kthread.thread.pushSlice(slice); 61 }, 62 63 cpufreqBoostSlice: function(ts, eventName, args) { 64 var kthread = this.importer.getOrCreatePseudoThread('cpufreq_boost'); 65 kthread.openSlice = eventName; 66 var slice = new tracing.model.Slice('', kthread.openSlice, 67 tracing.getStringColorId(kthread.openSlice), ts, args, 0); 68 69 kthread.thread.pushSlice(slice); 70 }, 71 72 /** 73 * Parses cpufreq events and sets up state in the importer. 74 */ 75 cpufreqUpDownEvent: function(eventName, cpuNumber, pid, ts, eventBase) { 76 var data = splitData(eventBase.details); 77 this.cpufreqSlice(ts, eventName, data.cpu, data); 78 return true; 79 }, 80 81 cpufreqTargetEvent: function(eventName, cpuNumber, pid, ts, 82 eventBase) { 83 var data = splitData(eventBase.details); 84 this.cpufreqSlice(ts, eventName, data.cpu, data); 85 return true; 86 }, 87 88 cpufreqBoostUnboostEvent: function(eventName, cpuNumber, pid, ts, 89 eventBase) { 90 this.cpufreqBoostSlice(ts, eventName, 91 { 92 type: eventBase.details 93 }); 94 return true; 95 } 96 }; 97 98 Parser.registerSubtype(CpufreqParser); 99 100 return { 101 CpufreqParser: CpufreqParser 102 }; 103 }); 104