6b5b7b8cb27a008f3402361698b427245f034ce9
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / src / tracing / importer / linux_perf / workqueue_parser.js
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  */
10 tvcm.require('tracing.importer.linux_perf.parser');
11 tvcm.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 });