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 workqueue 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 workqueue trace events.
     15    * @constructor
     16    */
     17   function WorkqueueParser(importer) {
     18     Parser.call(this, importer);
     19 
     20     importer.registerEventHandler('workqueue_execute_start',
     21         WorkqueueParser.prototype.executeStartEvent.bind(this));
     22     importer.registerEventHandler('workqueue_execute_end',
     23         WorkqueueParser.prototype.executeEndEvent.bind(this));
     24     importer.registerEventHandler('workqueue_queue_work',
     25         WorkqueueParser.prototype.executeQueueWork.bind(this));
     26     importer.registerEventHandler('workqueue_activate_work',
     27         WorkqueueParser.prototype.executeActivateWork.bind(this));
     28   }
     29 
     30   // Matches the workqueue_execute_start record
     31   //  workqueue_execute_start: work struct c7a8a89c: function MISRWrapper
     32   var workqueueExecuteStartRE = /work struct (.+): function (\S+)/;
     33 
     34   // Matches the workqueue_execute_start record
     35   //  workqueue_execute_end: work struct c7a8a89c
     36   var workqueueExecuteEndRE = /work struct (.+)/;
     37 
     38   WorkqueueParser.prototype = {
     39     __proto__: Parser.prototype,
     40 
     41     /**
     42      * Parses workqueue events and sets up state in the importer.
     43      */
     44     executeStartEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
     45       var event = workqueueExecuteStartRE.exec(eventBase.details);
     46       if (!event)
     47         return false;
     48 
     49       var kthread = this.importer.getOrCreateKernelThread(eventBase.threadName,
     50         pid, pid);
     51       kthread.openSliceTS = ts;
     52       kthread.openSlice = event[2];
     53       return true;
     54     },
     55 
     56     executeEndEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
     57       var event = workqueueExecuteEndRE.exec(eventBase.details);
     58       if (!event)
     59         return false;
     60 
     61       var kthread = this.importer.getOrCreateKernelThread(eventBase.threadName,
     62         pid, pid);
     63       if (kthread.openSlice) {
     64         var slice = new tracing.model.Slice('', kthread.openSlice,
     65             tracing.getStringColorId(kthread.openSlice),
     66             kthread.openSliceTS,
     67             {},
     68             ts - kthread.openSliceTS);
     69 
     70         kthread.thread.pushSlice(slice);
     71       }
     72       kthread.openSlice = undefined;
     73       return true;
     74     },
     75 
     76     executeQueueWork: function(eventName, cpuNumber, pid, ts, eventBase) {
     77       // TODO: Do something with this event?
     78       return true;
     79     },
     80 
     81     executeActivateWork: function(eventName, cpuNumber, pid, ts, eventBase) {
     82       // TODO: Do something with this event?
     83       return true;
     84     },
     85 
     86   };
     87 
     88   Parser.registerSubtype(WorkqueueParser);
     89 
     90   return {
     91     WorkqueueParser: WorkqueueParser
     92   };
     93 });
     94