// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview Base class for linux perf event parsers. * * The linux perf trace event importer depends on subclasses of * LinuxPerfParser to parse event data. Each subclass corresponds * to a group of trace events; e.g. LinuxPerfSchedParser implements * parsing of sched:* kernel trace events. Parser subclasses must * call LinuxPerfParser.registerSubtype to arrange to be instantiated * and their constructor must register their event handlers with the * importer. For example, * * var LinuxPerfParser = tracing.LinuxPerfParser; * * function LinuxPerfWorkqueueParser(importer) { * LinuxPerfParser.call(this, importer); * * importer.registerEventHandler('workqueue_execute_start', * LinuxPerfWorkqueueParser.prototype.executeStartEvent.bind(this)); * importer.registerEventHandler('workqueue_execute_end', * LinuxPerfWorkqueueParser.prototype.executeEndEvent.bind(this)); * } * * LinuxPerfParser.registerSubtype(LinuxPerfWorkqueueParser); * * When a registered event name is found in the data stream the associated * event handler is invoked: * * executeStartEvent: function(eventName, cpuNumber, ts, eventBase) * * If the routine returns false the caller will generate an import error * saying there was a problem parsing it. Handlers can also emit import * messages using this.importer.importError. If this is done in lieu of * the generic import error it may be desirable for the handler to return * true. * * Trace events generated by writing to the trace_marker file are expected * to have a leading text marker followed by a ':'; e.g. the trace clock * synchronization event is: * * tracing_mark_write: trace_event_clock_sync: parent_ts=0 * * To register an event handler for these events, prepend the marker with * 'tracing_mark_write:'; e.g. * * this.registerEventHandler('tracing_mark_write:trace_event_clock_sync', * * All subclasses should depend on linux_perf_parser, e.g. * * base.defineModule('linux_perf_workqueue_parser') * .dependsOn('linux_perf_parser') * .exportsTo('tracing', function() * * and be listed in the dependsOn of LinuxPerfImporter. Beware that after * adding a new subclass you must run build/generate_about_tracing_contents.py * to regenerate about_tracing.*. */ base.exportTo('tracing', function() { var subtypeConstructors = []; /** * Registers a subclass that will help parse linux perf events. * The importer will call createParsers (below) before importing * data so each subclass can register its handlers. * * @param {Function} subtypeConstructor The subtype's constructor function. */ LinuxPerfParser.registerSubtype = function(subtypeConstructor) { subtypeConstructors.push(subtypeConstructor); }; LinuxPerfParser.getSubtypeConstructors = function() { return subtypeConstructors; }; /** * Parses linux perf events. * @constructor */ function LinuxPerfParser(importer) { this.importer = importer; } LinuxPerfParser.prototype = { __proto__: Object.prototype }; return { LinuxPerfParser: LinuxPerfParser }; });