| <!DOCTYPE html> |
| <!-- |
| 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. |
| --> |
| |
| <link rel="import" href="/extras/importer/linux_perf/parser.html"> |
| |
| <script> |
| 'use strict'; |
| |
| /** |
| * @fileoverview Parses scheduler events in the Linux event trace format. |
| */ |
| tv.exportTo('tv.e.importer.linux_perf', function() { |
| |
| var Parser = tv.e.importer.linux_perf.Parser; |
| |
| /** |
| * Parses linux sched trace events. |
| * @constructor |
| */ |
| function SchedParser(importer) { |
| Parser.call(this, importer); |
| |
| importer.registerEventHandler('sched_switch', |
| SchedParser.prototype.schedSwitchEvent.bind(this)); |
| importer.registerEventHandler('sched_wakeup', |
| SchedParser.prototype.schedWakeupEvent.bind(this)); |
| } |
| |
| var 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; |
| |
| SchedParser.prototype = { |
| __proto__: Parser.prototype, |
| |
| /** |
| * Parses scheduler events and sets up state in the CPUs of the importer. |
| */ |
| schedSwitchEvent: function(eventName, cpuNumber, pid, ts, eventBase) { |
| var event = schedSwitchRE.exec(eventBase.details); |
| if (!event) |
| return false; |
| |
| var prevState = event[4]; |
| var nextComm = event[5]; |
| var nextPid = parseInt(event[6]); |
| var nextPrio = parseInt(event[7]); |
| |
| var nextThread = this.importer.threadsByLinuxPid[nextPid]; |
| var nextName; |
| if (nextThread) |
| nextName = nextThread.userFriendlyName; |
| else |
| nextName = nextComm; |
| |
| var cpu = this.importer.getOrCreateCpu(cpuNumber); |
| cpu.switchActiveThread( |
| ts, |
| {stateWhenDescheduled: prevState}, |
| nextPid, |
| nextName, |
| { |
| comm: nextComm, |
| tid: nextPid, |
| prio: nextPrio |
| }); |
| |
| return true; |
| }, |
| |
| schedWakeupEvent: function(eventName, cpuNumber, pid, ts, eventBase) { |
| var event = schedWakeupRE.exec(eventBase.details); |
| if (!event) |
| return false; |
| |
| var fromPid = pid; |
| var comm = event[1]; |
| var pid = parseInt(event[2]); |
| var prio = parseInt(event[3]); |
| this.importer.markPidRunnable(ts, pid, comm, prio, fromPid); |
| return true; |
| } |
| }; |
| |
| Parser.register(SchedParser); |
| |
| return { |
| SchedParser: SchedParser, |
| _SchedParserTestExports: TestExports |
| }; |
| }); |
| </script> |
| |