166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis/**
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @fileoverview Parses trace_marker events that were inserted in the trace by
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * userland.
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.importer.linux_perf.parser');
126833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennisbase.require('tracing.trace_model.counter_series');
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.importer.linux_perf', function() {
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var Parser = tracing.importer.linux_perf.Parser;
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /**
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * Parses linux trace mark events that were inserted in the trace by userland.
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * @constructor
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  function BusParser(importer) {
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    Parser.call(this, importer);
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    importer.registerEventHandler('memory_bus_usage',
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        BusParser.prototype.traceMarkWriteBusEvent.bind(this));
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.model_ = importer.model_;
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.ppids_ = {};
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  BusParser.prototype = {
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: Parser.prototype,
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    traceMarkWriteBusEvent: function(eventName, cpuNumber, pid, ts,
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                                  eventBase, threadName) {
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var re = new RegExp('bus=(\\S+) rw_bytes=(\\d+) r_bytes=(\\d+) ' +
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                            'w_bytes=(\\d+) cycles=(\\d+) ns=(\\d+)');
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var event = re.exec(eventBase.details);
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var name = event[1];
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var rw_bytes = parseInt(event[2]);
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var r_bytes = parseInt(event[3]);
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var w_bytes = parseInt(event[4]);
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var cycles = parseInt(event[5]);
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var ns = parseInt(event[6]);
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      // BW in MB/s
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var r_bw = r_bytes * 1000000000 / ns;
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      r_bw /= 1024 * 1024;
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var w_bw = w_bytes * 1000000000 / ns;
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      w_bw /= 1024 * 1024;
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var ctr = this.model_.getOrCreateProcess(0)
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis              .getOrCreateCounter(null, 'bus ' + name + ' read');
566833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      if (ctr.numSeries === 0) {
576833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        ctr.addSeries(new tracing.trace_model.CounterSeries('value',
586833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis            tracing.getStringColorId(ctr.name + '.' + 'value')));
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
606833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      ctr.series.forEach(function(series) {
616833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        series.addSample(ts, r_bw);
626833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      });
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      ctr = this.model_.getOrCreateProcess(0)
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis              .getOrCreateCounter(null, 'bus ' + name + ' write');
666833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      if (ctr.numSeries === 0) {
676833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        ctr.addSeries(new tracing.trace_model.CounterSeries('value',
686833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis            tracing.getStringColorId(ctr.name + '.' + 'value')));
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
706833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      ctr.series.forEach(function(series) {
716833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        series.addSample(ts, r_bw);
726833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      });
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return true;
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Parser.registerSubtype(BusParser);
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    BusParser: BusParser
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
84