• 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/**
6 * @fileoverview Parses gesture events in the Linux event trace format.
7 */
8base.require('linux_perf_parser');
9base.exportTo('tracing', function() {
10
11  var LinuxPerfParser = tracing.LinuxPerfParser;
12
13  /**
14   * Parses trace events generated by gesture library for touchpad.
15   * @constructor
16   */
17  function LinuxPerfGestureParser(importer) {
18    LinuxPerfParser.call(this, importer);
19    importer.registerEventHandler('tracing_mark_write:log',
20        LinuxPerfGestureParser.prototype.logEvent.bind(this));
21    importer.registerEventHandler('tracing_mark_write:SyncInterpret',
22        LinuxPerfGestureParser.prototype.syncEvent.bind(this));
23    importer.registerEventHandler('tracing_mark_write:HandleTimer',
24        LinuxPerfGestureParser.prototype.timerEvent.bind(this));
25  }
26
27  LinuxPerfGestureParser.prototype = {
28    __proto__: LinuxPerfParser.prototype,
29
30    /**
31     * Parse events generate by gesture library.
32     * gestureOpenSlice and gestureCloseSlice are two common
33     * functions to store the begin time and end time for all
34     * events in gesture library
35     */
36    gestureOpenSlice: function(title, ts, opt_args) {
37      this.importer.getOrCreatePseudoThread('gesture').thread.beginSlice(
38              'touchpad_gesture', title, ts, opt_args);
39    },
40
41    gestureCloseSlice: function(title, ts) {
42      var thread = this.importer.getOrCreatePseudoThread('gesture').thread;
43      if (thread.openSliceCount) {
44        var slice = thread.openPartialSlices_[thread.openSliceCount - 1];
45        if (slice.title != title) {
46           this.importer.importError('Titles do not match. Title is ' +
47                                     slice.title + ' in openSlice, and is ' +
48                                     title + ' in endSlice');
49        } else {
50          thread.endSlice(ts);
51        }
52      }
53    },
54
55    /**
56     * For log events, events will come in pairs with a tag log:
57     * like this:
58     * tracing_mark_write: log: start: TimerLogOutputs
59     * tracing_mark_write: log: end: TimerLogOutputs
60     * which represent the start and the end time of certain log behavior
61     * Take these logs above for example, they are the start and end time
62     * of logging Output for HandleTimer function
63     */
64    logEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
65      var innerEvent =
66          /^\s*(\w+):\s*(\w+)$/.exec(eventBase[2]);
67      switch (innerEvent[1]) {
68        case 'start':
69          this.gestureOpenSlice('GestureLog', ts, {name: innerEvent[2]});
70          break;
71        case 'end':
72          this.gestureCloseSlice('GestureLog', ts);
73      }
74      return true;
75    },
76
77    /**
78     * For SyncInterpret events, events will come in pairs with
79     * a tag SyncInterpret:
80     * like this:
81     * tracing_mark_write: SyncInterpret: start: ClickWiggleFilterInterpreter
82     * tracing_mark_write: SyncInterpret: end: ClickWiggleFilterInterpreter
83     * which represent the start and the end time of SyncInterpret function
84     * inside the certain interpreter in the gesture library.
85     * Take the logs above for example, they are the start and end time
86     * of the SyncInterpret function inside ClickWiggleFilterInterpreter
87     */
88    syncEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
89      var innerEvent = /^\s*(\w+):\s*(\w+)$/.exec(eventBase[2]);
90      switch (innerEvent[1]) {
91        case 'start':
92          this.gestureOpenSlice('SyncInterpret', ts,
93                                {interpreter: innerEvent[2]});
94          break;
95        case 'end':
96          this.gestureCloseSlice('SyncInterpret', ts);
97      }
98      return true;
99    },
100
101    /**
102     * For HandleTimer events, events will come in pairs with
103     * a tag HandleTimer:
104     * like this:
105     * tracing_mark_write: HandleTimer: start: LookaheadFilterInterpreter
106     * tracing_mark_write: HandleTimer: end: LookaheadFilterInterpreter
107     * which represent the start and the end time of HandleTimer function
108     * inside the certain interpreter in the gesture library.
109     * Take the logs above for example, they are the start and end time
110     * of the HandleTimer function inside LookaheadFilterInterpreter
111     */
112    timerEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
113      var innerEvent = /^\s*(\w+):\s*(\w+)$/.exec(eventBase[2]);
114      switch (innerEvent[1]) {
115        case 'start':
116          this.gestureOpenSlice('HandleTimer', ts,
117                                {interpreter: innerEvent[2]});
118          break;
119        case 'end':
120          this.gestureCloseSlice('HandleTimer', ts);
121      }
122      return true;
123    }
124  };
125
126  LinuxPerfParser.registerSubtype(LinuxPerfGestureParser);
127
128  return {
129    LinuxPerfGestureParser: LinuxPerfGestureParser
130  };
131});
132