157a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling// Copyright (c) 2012 The Chromium Authors. All rights reserved.
257a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling// Use of this source code is governed by a BSD-style license that can be
357a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling// found in the LICENSE file.
457a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
757a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling/**
857a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling * @fileoverview Parses trace_marker events that were inserted in the trace by
957a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling * userland.
1057a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling */
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.importer.linux_perf.parser');
126833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennisbase.require('tracing.trace_model.counter_series');
136833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis
1488448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.exportTo('tracing.importer.linux_perf', function() {
1557a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
1688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  var Parser = tracing.importer.linux_perf.Parser;
1757a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
1857a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling  /**
1957a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling   * Parses linux trace mark events that were inserted in the trace by userland.
2057a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling   * @constructor
2157a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling   */
2288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  function ClockParser(importer) {
2388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    Parser.call(this, importer);
2457a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
2557a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling    importer.registerEventHandler('clock_set_rate',
2688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown        ClockParser.prototype.traceMarkWriteClockEvent.bind(this));
2757a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
2857a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling    this.model_ = importer.model_;
2957a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling    this.ppids_ = {};
3057a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling  }
3157a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
3288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  ClockParser.prototype = {
3388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    __proto__: Parser.prototype,
3457a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
3557a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling    traceMarkWriteClockEvent: function(eventName, cpuNumber, pid, ts,
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis                                       eventBase, threadName) {
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var event = /(\S+) state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);
3857a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
3957a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var name = event[1];
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var rate = parseInt(event[2]);
4257a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var ctr = this.model_.getOrCreateProcess(0)
4457a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling              .getOrCreateCounter(null, name);
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      // Initialize the counter's series fields if needed.
466833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      if (ctr.numSeries === 0) {
476833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        ctr.addSeries(new tracing.trace_model.CounterSeries('value',
486833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis            tracing.getStringColorId(ctr.name + '.' + 'value')));
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
506833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      ctr.series.forEach(function(series) {
516833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis        series.addSample(ts, rate);
526833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis      });
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return true;
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
5657a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling  };
5757a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
5888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.registerSubtype(ClockParser);
5957a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling
6057a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling  return {
6188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    ClockParser: ClockParser
6257a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling  };
6357a636a44b62b6d8aece3b27aee6ddac2c8c4d8bErik Gilling});
64