summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
committerZeno Albisser <zeno.albisser@digia.com>2013-08-15 21:46:11 +0200
commit679147eead574d186ebf3069647b4c23e8ccace6 (patch)
treefc247a0ac8ff119f7c8550879ebb6d3dd8d1ff69 /chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js
Initial import.
Diffstat (limited to 'chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js')
-rw-r--r--chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js b/chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js
new file mode 100644
index 00000000000..424229331d3
--- /dev/null
+++ b/chromium/third_party/trace-viewer/src/tracing/importer/linux_perf/kfunc_parser.js
@@ -0,0 +1,106 @@
+// Copyright (c) 2013 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.
+
+'use strict';
+
+/**
+ * @fileoverview Parses graph_ent and graph_ret events that were inserted by
+ * the Linux kernel's function graph trace.
+ */
+base.require('tracing.importer.linux_perf.parser');
+base.exportTo('tracing.importer.linux_perf', function() {
+
+ var LinuxPerfParser = tracing.importer.linux_perf.Parser;
+
+ /**
+ * Parses graph_ent and graph_ret events that were inserted by the Linux
+ * kernel's function graph trace.
+ * @constructor
+ */
+ function KernelFuncParser(importer) {
+ LinuxPerfParser.call(this, importer);
+
+ importer.registerEventHandler('graph_ent',
+ KernelFuncParser.prototype.traceKernelFuncEnterEvent.
+ bind(this));
+ importer.registerEventHandler('graph_ret',
+ KernelFuncParser.prototype.traceKernelFuncReturnEvent.
+ bind(this));
+
+ this.model_ = importer.model_;
+ this.ppids_ = {};
+ }
+
+ var TestExports = {};
+
+ var funcEnterRE = new RegExp('func=(.+)');
+ TestExports.funcEnterRE = funcEnterRE;
+
+ KernelFuncParser.prototype = {
+ __proto__: LinuxPerfParser.prototype,
+
+ traceKernelFuncEnterEvent: function(eventName, cpuNumber, pid, ts,
+ eventBase) {
+ var eventData = funcEnterRE.exec(eventBase.details);
+ if (!eventData)
+ return false;
+
+ if (eventBase.tgid === undefined) {
+ return false;
+ }
+
+ var tgid = parseInt(eventBase.tgid);
+ var name = eventData[1];
+ var thread = this.model_.getOrCreateProcess(tgid)
+ .getOrCreateThread(pid);
+ thread.name = eventBase.threadName;
+
+ var slices = thread.kernelSliceGroup;
+ if (!slices.isTimestampValidForBeginOrEnd(ts)) {
+ this.model_.importWarning({
+ type: 'parse_error',
+ message: 'Timestamps are moving backward.'
+ });
+ return false;
+ }
+
+ var slice = slices.beginSlice(null, name, ts, {});
+
+ return true;
+ },
+
+ traceKernelFuncReturnEvent: function(eventName, cpuNumber, pid, ts,
+ eventBase) {
+ if (eventBase.tgid === undefined) {
+ return false;
+ }
+
+ var tgid = parseInt(eventBase.tgid);
+ var thread = this.model_.getOrCreateProcess(tgid)
+ .getOrCreateThread(pid);
+ thread.name = eventBase.threadName;
+
+ var slices = thread.kernelSliceGroup;
+ if (!slices.isTimestampValidForBeginOrEnd(ts)) {
+ this.model_.importWarning({
+ type: 'parse_error',
+ message: 'Timestamps are moving backward.'
+ });
+ return false;
+ }
+
+ if (slices.openSliceCount > 0) {
+ slices.endSlice(ts);
+ }
+
+ return true;
+ }
+ };
+
+ LinuxPerfParser.registerSubtype(KernelFuncParser);
+
+ return {
+ KernelFuncParser: KernelFuncParser
+ };
+});