// 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 Parses scheduler events in the Linux event trace format. */ base.require('linux_perf_parser'); base.exportTo('tracing', function() { var LinuxPerfParser = tracing.LinuxPerfParser; /** * Parses linux sched trace events. * @constructor */ function LinuxPerfSchedParser(importer) { LinuxPerfParser.call(this, importer); importer.registerEventHandler('sched_switch', LinuxPerfSchedParser.prototype.schedSwitchEvent.bind(this)); importer.registerEventHandler('sched_wakeup', LinuxPerfSchedParser.prototype.schedWakeupEvent.bind(this)); } TestExports = {}; // Matches the sched_switch record var schedSwitchRE = new RegExp( 'prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) ' + 'prev_state=(\\S\\+?|\\S\\|\\S) ==> ' + 'next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)'); TestExports.schedSwitchRE = schedSwitchRE; // Matches the sched_wakeup record var schedWakeupRE = /comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/; TestExports.schedWakeupRE = schedWakeupRE; LinuxPerfSchedParser.prototype = { __proto__: LinuxPerfParser.prototype, /** * Parses scheduler events and sets up state in the importer. */ schedSwitchEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = schedSwitchRE.exec(eventBase[5]); if (!event) return false; var prevState = event[4]; var nextComm = event[5]; var nextPid = parseInt(event[6]); var nextPrio = parseInt(event[7]); var cpuState = this.importer.getOrCreateCpuState(cpuNumber); cpuState.switchRunningLinuxPid(this.importer, prevState, ts, nextPid, nextComm, nextPrio); return true; }, schedWakeupEvent: function(eventName, cpuNumber, pid, ts, eventBase) { var event = schedWakeupRE.exec(eventBase[5]); if (!event) return false; var comm = event[1]; var pid = parseInt(event[2]); var prio = parseInt(event[3]); this.importer.markPidRunnable(ts, pid, comm, prio); return true; } }; LinuxPerfParser.registerSubtype(LinuxPerfSchedParser); return { LinuxPerfSchedParser: LinuxPerfSchedParser, _LinuxPerfSchedParserTestExports: TestExports }; });