Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Unified Diff: tracing/tracing/extras/importer/linux_perf/ftrace_importer.html

Issue 2755943002: tracing: Stream processing for some importers (Closed)
Patch Set: review / sync Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
diff --git a/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html b/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
index 429a00e47e139b3368e924bfd7a63343926e4899..c276f808932363096dfdebf2e89f8ae68a0c3834 100644
--- a/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
+++ b/tracing/tracing/extras/importer/linux_perf/ftrace_importer.html
@@ -7,6 +7,7 @@ found in the LICENSE file.
<link rel="import" href="/tracing/base/color_scheme.html">
<link rel="import" href="/tracing/base/iteration_helpers.html">
+<link rel="import" href="/tracing/base/trace_stream.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/android_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/binder_parser.html">
<link rel="import" href="/tracing/extras/importer/linux_perf/bus_parser.html">
@@ -86,9 +87,7 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');
var lineParserWithTGID = function(line) {
var groups = lineREWithTGID.exec(line);
- if (!groups) {
- return groups;
- }
+ if (!groups) return groups;
var tgid = groups[3];
if (tgid[0] === '-') tgid = undefined;
@@ -113,9 +112,7 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');
var lineParserWithIRQInfo = function(line) {
var groups = lineREWithIRQInfo.exec(line);
- if (!groups) {
- return groups;
- }
+ if (!groups) return groups;
return {
threadName: groups[1],
pid: groups[2],
@@ -169,15 +166,9 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
*/
function autoDetectLineParser(line) {
if (line[0] === '{') return false;
- if (lineREWithTGID.test(line)) {
- return lineParserWithTGID;
- }
- if (lineREWithIRQInfo.test(line)) {
- return lineParserWithIRQInfo;
- }
- if (lineREWithLegacyFmt.test(line)) {
- return lineParserWithLegacyFmt;
- }
+ if (lineREWithTGID.test(line)) return lineParserWithTGID;
+ if (lineREWithIRQInfo.test(line)) return lineParserWithIRQInfo;
+ if (lineREWithLegacyFmt.test(line)) return lineParserWithLegacyFmt;
return undefined;
}
TestExports.autoDetectLineParser = autoDetectLineParser;
@@ -191,6 +182,8 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
* @return {boolean} True when events is a linux perf array.
*/
FTraceImporter.canImport = function(events) {
+ if (events instanceof tr.b.TraceStream) events = events.header;
+
if (!(typeof(events) === 'string' || events instanceof String)) {
return false;
}
@@ -203,18 +196,12 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
return true;
}
- if (/^# tracer:/.test(events)) {
- return true;
- }
+ if (/^# tracer:/.test(events)) return true;
var lineBreakIndex = events.indexOf('\n');
- if (lineBreakIndex > -1) {
- events = events.substring(0, lineBreakIndex);
- }
+ if (lineBreakIndex > -1) events = events.substring(0, lineBreakIndex);
- if (autoDetectLineParser(events)) {
- return true;
- }
+ if (autoDetectLineParser(events)) return true;
return false;
};
@@ -222,48 +209,34 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
FTraceImporter._extractEventsFromSystraceHTML = function(
incomingEvents, produceResult) {
var failure = {ok: false};
- if (produceResult === undefined) {
- produceResult = true;
- }
+ if (produceResult === undefined) produceResult = true;
- if (!/^<!DOCTYPE html>/.test(incomingEvents)) {
- return failure;
- }
+ const header = incomingEvents instanceof tr.b.TraceStream ?
+ incomingEvents.header : incomingEvents;
+ if (!/^<!DOCTYPE html>/.test(header)) return failure;
var r = new tr.importer.SimpleLineReader(incomingEvents);
// Try to find the data...
- if (!r.advanceToLineMatching(/^ <script>$/)) {
- return failure;
- }
- if (!r.advanceToLineMatching(/^ var linuxPerfData = "\\$/)) {
- return failure;
- }
+ if (!r.advanceToLineMatching(/^ <script>$/)) return failure;
+ if (!r.advanceToLineMatching(/^ var linuxPerfData = "\\$/)) return failure;
var eventsBeginAtLine = r.curLineNumber + 1;
r.beginSavingLines();
- if (!r.advanceToLineMatching(/^ <\/script>$/)) {
- return failure;
- }
+ if (!r.advanceToLineMatching(/^ <\/script>$/)) return failure;
var rawEvents = r.endSavingLinesAndGetResult();
// Drop off first and last event as it contains the tag.
rawEvents = rawEvents.slice(1, rawEvents.length - 1);
- if (!r.advanceToLineMatching(/^<\/body>$/)) {
- return failure;
- }
- if (!r.advanceToLineMatching(/^<\/html>$/)) {
- return failure;
- }
+ if (!r.advanceToLineMatching(/^<\/body>$/)) return failure;
+ if (!r.advanceToLineMatching(/^<\/html>$/)) return failure;
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
function stripSuffix(str, suffix) {
- if (!endsWith(str, suffix)) {
- return str;
- }
+ if (!endsWith(str, suffix)) return str;
return str.substring(str, str.length - suffix.length);
}
@@ -283,9 +256,7 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
// treating absence of that trailing string as a failure.
var oldLastEvent = events[events.length - 1];
var newLastEvent = stripSuffix(oldLastEvent, '\\n";');
- if (newLastEvent === oldLastEvent) {
- return failure;
- }
+ if (newLastEvent === oldLastEvent) return failure;
events[events.length - 1] = newLastEvent;
return {ok: true,
@@ -296,13 +267,11 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
FTraceImporter._extractEventsFromSystraceMultiHTML = function(
incomingEvents, produceResult) {
var failure = {ok: false};
- if (produceResult === undefined) {
- produceResult = true;
- }
+ if (produceResult === undefined) produceResult = true;
- if (!(new RegExp('^<!DOCTYPE HTML>', 'i').test(incomingEvents))) {
- return failure;
- }
+ const header = incomingEvents instanceof tr.b.TraceStream ?
+ incomingEvents.header : incomingEvents;
+ if (!(new RegExp('^<!DOCTYPE HTML>', 'i').test(header))) return failure;
var r = new tr.importer.SimpleLineReader(incomingEvents);
@@ -325,12 +294,8 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
events = events.slice(1, events.length - 1);
}
- if (!r.advanceToLineMatching(/^<\/body>$/)) {
- return failure;
- }
- if (!r.advanceToLineMatching(/^<\/html>$/)) {
- return failure;
- }
+ if (!r.advanceToLineMatching(/^<\/body>$/)) return failure;
+ if (!r.advanceToLineMatching(/^<\/html>$/)) return failure;
return {ok: true,
lines: produceResult ? events : undefined,
@@ -355,9 +320,7 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
this.lazyInit_();
this.forEachLine_(function(text, eventBase, cpuNumber, pid, ts) {
var eventName = eventBase.eventName;
- if (eventName !== 'tracing_mark_write' && eventName !== '0') {
- return;
- }
+ if (eventName !== 'tracing_mark_write' && eventName !== '0') return;
if (traceEventClockSyncRE.exec(eventBase.details) ||
genericClockSyncRE.exec(eventBase.details)) {
@@ -872,59 +835,67 @@ tr.exportTo('tr.e.importer.linux_perf', function() {
* Walks the this.events_ structure and populates this.lines_.
*/
parseLines_: function() {
- var lines = [];
var extractResult = FTraceImporter._extractEventsFromSystraceHTML(
this.events_, true);
if (!extractResult.ok) {
extractResult = FTraceImporter._extractEventsFromSystraceMultiHTML(
this.events_, true);
}
- var lines = extractResult.ok ?
- extractResult.lines : this.events_.split('\n');
-
- var lineParser = undefined;
- for (var lineNumber = 0; lineNumber < lines.length; ++lineNumber) {
- var line = lines[lineNumber].trim();
- if (line.length === 0) continue;
- if (/^#/.test(line)) {
- const clockType = /^# clock_type=([A-Z_]+)$/.exec(line);
- // This allows the clock domain to be specified through a comment,
- // Ex. "# clock_type=LINUX_CLOCK_MONOTONIC".
- // This is used in the WALT trace agent.
- if (clockType) {
- this.clockDomainId_ = clockType[1];
- }
- continue;
+ let lineParser = undefined;
+ if (extractResult.ok) {
+ for (const line of extractResult.lines) {
+ lineParser = this.parseLine_(line, lineParser);
+ }
+ } else {
+ const r = new tr.importer.SimpleLineReader(this.events_);
+ for (const line of r) {
+ lineParser = this.parseLine_(line, lineParser);
}
+ }
+ },
- if (!lineParser) {
- lineParser = autoDetectLineParser(line);
- if (!lineParser) {
- this.model_.importWarning({
- type: 'parse_error',
- message: 'Cannot parse line: ' + line
- });
- continue;
- }
+ parseLine_: function(line, lineParser) {
+ line = line.trim();
+ if (line.length === 0) return lineParser;
+ if (/^#/.test(line)) {
+ const clockType = /^# clock_type=([A-Z_]+)$/.exec(line);
+ // This allows the clock domain to be specified through a comment,
+ // Ex. "# clock_type=LINUX_CLOCK_MONOTONIC".
+ // This is used in the WALT trace agent.
+ if (clockType) {
+ this.clockDomainId_ = clockType[1];
}
+ return lineParser;
+ }
- var eventBase = lineParser(line);
- if (!eventBase) {
+ if (!lineParser) {
+ lineParser = autoDetectLineParser(line);
+ if (!lineParser) {
this.model_.importWarning({
type: 'parse_error',
- message: 'Unrecognized line: ' + line
+ message: 'Cannot parse line: ' + line
});
- continue;
+ return lineParser;
}
+ }
- this.lines_.push([
- line,
- eventBase,
- parseInt(eventBase.cpuNumber),
- parseInt(eventBase.pid),
- parseFloat(eventBase.timestamp) * 1000
- ]);
+ var eventBase = lineParser(line);
+ if (!eventBase) {
+ this.model_.importWarning({
+ type: 'parse_error',
+ message: 'Unrecognized line: ' + line
+ });
+ return lineParser;
}
+
+ this.lines_.push([
+ line,
+ eventBase,
+ parseInt(eventBase.cpuNumber),
+ parseInt(eventBase.pid),
+ parseFloat(eventBase.timestamp) * 1000
+ ]);
+ return lineParser;
},
/**

Powered by Google App Engine
This is Rietveld 408576698