Home | History | Annotate | Download | only in linux_perf
      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