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