12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Use of this source code is governed by a BSD-style license that can be
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// found in the LICENSE file.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis/**
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * @fileoverview Base class for linux perf event parsers.
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * The linux perf trace event importer depends on subclasses of
1188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Parser to parse event data.  Each subclass corresponds
1288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * to a group of trace events; e.g. SchedParser implements
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * parsing of sched:* kernel trace events.  Parser subclasses must
1488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * call Parser.registerSubtype to arrange to be instantiated
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * and their constructor must register their event handlers with the
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * importer.  For example,
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
1888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * var Parser = tracing.importer.linux_perf.Parser;
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
2088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * function WorkqueueParser(importer) {
2188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown *   Parser.call(this, importer);
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *   importer.registerEventHandler('workqueue_execute_start',
2488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown *       WorkqueueParser.prototype.executeStartEvent.bind(this));
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *   importer.registerEventHandler('workqueue_execute_end',
2688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown *       WorkqueueParser.prototype.executeEndEvent.bind(this));
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * }
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
2988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Parser.registerSubtype(WorkqueueParser);
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * When a registered event name is found in the data stream the associated
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * event handler is invoked:
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *   executeStartEvent: function(eventName, cpuNumber, ts, eventBase)
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * If the routine returns false the caller will generate an import error
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * saying there was a problem parsing it.  Handlers can also emit import
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * messages using this.importer.importError.  If this is done in lieu of
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * the generic import error it may be desirable for the handler to return
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * true.
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * Trace events generated by writing to the trace_marker file are expected
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * to have a leading text marker followed by a ':'; e.g. the trace clock
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * synchronization event is:
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *  tracing_mark_write: trace_event_clock_sync: parent_ts=0
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * To register an event handler for these events, prepend the marker with
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * 'tracing_mark_write:'; e.g.
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *    this.registerEventHandler('tracing_mark_write:trace_event_clock_sync',
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
5388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * All subclasses should depend on importer.linux_perf.parser, e.g.
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
5588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * base.defineModule('importer.linux_perf.workqueue_parser')
5688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown *   .dependsOn('importer.linux_perf.parser')
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *   .exportsTo('tracing', function()
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis *
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * and be listed in the dependsOn of LinuxPerfImporter.  Beware that after
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * adding a new subclass you must run build/generate_about_tracing_contents.py
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis * to regenerate about_tracing.*.
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis */
6388448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.exportTo('tracing.importer.linux_perf', function() {
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  var subtypeConstructors = [];
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  /**
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * Registers a subclass that will help parse linux perf events.
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * The importer will call createParsers (below) before importing
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * data so each subclass can register its handlers.
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   *
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * @param {Function} subtypeConstructor The subtype's constructor function.
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   */
7488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.registerSubtype = function(subtypeConstructor) {
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    subtypeConstructors.push(subtypeConstructor);
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
7888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.getSubtypeConstructors = function() {
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return subtypeConstructors;
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  /**
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * Parses linux perf events.
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * @constructor
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   */
8688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  function Parser(importer) {
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    this.importer = importer;
8888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    this.model = importer.model;
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  }
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
9188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  Parser.prototype = {
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    __proto__: Object.prototype
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return {
9688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    Parser: Parser
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis});
100