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 trace_marker events that were inserted in the trace by
9 * userland.
10 */
11base.require('tracing.importer.linux_perf.parser');
12base.require('tracing.trace_model.counter_series');
13
14base.exportTo('tracing.importer.linux_perf', function() {
15
16  var Parser = tracing.importer.linux_perf.Parser;
17
18  /**
19   * Parses linux trace mark events that were inserted in the trace by userland.
20   * @constructor
21   */
22  function BusParser(importer) {
23    Parser.call(this, importer);
24
25    importer.registerEventHandler('memory_bus_usage',
26        BusParser.prototype.traceMarkWriteBusEvent.bind(this));
27
28    this.model_ = importer.model_;
29    this.ppids_ = {};
30  }
31
32  BusParser.prototype = {
33    __proto__: Parser.prototype,
34
35    traceMarkWriteBusEvent: function(eventName, cpuNumber, pid, ts,
36                                  eventBase, threadName) {
37      var re = new RegExp('bus=(\\S+) rw_bytes=(\\d+) r_bytes=(\\d+) ' +
38                            'w_bytes=(\\d+) cycles=(\\d+) ns=(\\d+)');
39      var event = re.exec(eventBase.details);
40
41      var name = event[1];
42      var rw_bytes = parseInt(event[2]);
43      var r_bytes = parseInt(event[3]);
44      var w_bytes = parseInt(event[4]);
45      var cycles = parseInt(event[5]);
46      var ns = parseInt(event[6]);
47
48      // BW in MB/s
49      var r_bw = r_bytes * 1000000000 / ns;
50      r_bw /= 1024 * 1024;
51      var w_bw = w_bytes * 1000000000 / ns;
52      w_bw /= 1024 * 1024;
53
54      var ctr = this.model_.getOrCreateProcess(0)
55              .getOrCreateCounter(null, 'bus ' + name + ' read');
56      if (ctr.numSeries === 0) {
57        ctr.addSeries(new tracing.trace_model.CounterSeries('value',
58            tracing.getStringColorId(ctr.name + '.' + 'value')));
59      }
60      ctr.series.forEach(function(series) {
61        series.addSample(ts, r_bw);
62      });
63
64      ctr = this.model_.getOrCreateProcess(0)
65              .getOrCreateCounter(null, 'bus ' + name + ' write');
66      if (ctr.numSeries === 0) {
67        ctr.addSeries(new tracing.trace_model.CounterSeries('value',
68            tracing.getStringColorId(ctr.name + '.' + 'value')));
69      }
70      ctr.series.forEach(function(series) {
71        series.addSample(ts, r_bw);
72      });
73
74      return true;
75    }
76  };
77
78  Parser.registerSubtype(BusParser);
79
80  return {
81    BusParser: BusParser
82  };
83});
84