• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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