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