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