• 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 irq 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 irq trace events.
17   * @constructor
18   */
19  function IrqParser(importer) {
20    Parser.call(this, importer);
21
22    importer.registerEventHandler('irq_handler_entry',
23        IrqParser.prototype.irqHandlerEntryEvent.bind(this));
24    importer.registerEventHandler('irq_handler_exit',
25        IrqParser.prototype.irqHandlerExitEvent.bind(this));
26    importer.registerEventHandler('softirq_raise',
27        IrqParser.prototype.softirqRaiseEvent.bind(this));
28    importer.registerEventHandler('softirq_entry',
29        IrqParser.prototype.softirqEntryEvent.bind(this));
30    importer.registerEventHandler('softirq_exit',
31        IrqParser.prototype.softirqExitEvent.bind(this));
32  }
33
34  // Matches the irq_handler_entry record
35  var irqHandlerEntryRE = /irq=(\d+) name=(.+)/;
36
37  // Matches the irq_handler_exit record
38  var irqHandlerExitRE = /irq=(\d+) ret=(.+)/;
39
40  // Matches the softirq_raise record
41  var softirqRE = /vec=(\d+) \[action=(.+)\]/;
42
43  IrqParser.prototype = {
44    __proto__: Parser.prototype,
45
46    /**
47     * Parses irq events and sets up state in the importer.
48     */
49    irqHandlerEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
50      var event = irqHandlerEntryRE.exec(eventBase.details);
51      if (!event)
52        return false;
53
54      var irq = parseInt(event[1]);
55      var name = event[2];
56
57      var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber);
58      thread.lastEntryTs = ts;
59      thread.irqName = name;
60
61      return true;
62    },
63
64    irqHandlerExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
65      var event = irqHandlerExitRE.exec(eventBase.details);
66      if (!event)
67        return false;
68
69      var irq = parseInt(event[1]);
70      var ret = event[2];
71      var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber);
72
73      if (thread.lastEntryTs !== undefined) {
74        var duration = ts - thread.lastEntryTs;
75        var slice = new tracing.trace_model.Slice(
76            '', thread.irqName,
77            tracing.getStringColorId(event[1]),
78            thread.lastEntryTs, { ret: ret },
79            duration);
80        thread.thread.sliceGroup.pushSlice(slice);
81      }
82      thread.lastEntryTs = undefined;
83      thread.irqName = undefined;
84      return true;
85    },
86
87    softirqRaiseEvent: function(eventName, cpuNumber, pid, ts, eventBase) {return true},
88
89    softirqEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
90      var event = softirqRE.exec(eventBase.details);
91      if (!event)
92        return false;
93
94      var action = event[2];
95      var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber);
96      thread.lastEntryTs = ts;
97
98      return true;
99    },
100
101    softirqExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
102      var event = softirqRE.exec(eventBase.details);
103      if (!event)
104        return false;
105
106      var vec = parseInt(event[1]);
107      var action = event[2];
108      var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber);
109
110      if (thread.lastEntryTs !== undefined) {
111        var duration = ts - thread.lastEntryTs;
112        var slice = new tracing.trace_model.Slice(
113            '', action,
114            tracing.getStringColorId(event[1]),
115            thread.lastEntryTs, { vec: vec },
116            duration);
117        thread.thread.sliceGroup.pushSlice(slice);
118      }
119      thread.lastEntryTs = undefined;
120      return true;
121    }
122  };
123
124  Parser.registerSubtype(IrqParser);
125
126  return {
127    IrqParser: IrqParser,
128  };
129});
130