3 Copyright (c) 2012 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="import" href="/tracing/importer/linux_perf/parser.html">
14 * @fileoverview Parses sync events in the Linux event trace format.
16 tvcm.exportTo('tracing.importer.linux_perf', function() {
18 var Parser = tracing.importer.linux_perf.Parser;
21 * Parses linux sync trace events.
24 function SyncParser(importer) {
25 Parser.call(this, importer);
27 importer.registerEventHandler(
29 SyncParser.prototype.timelineEvent.bind(this));
30 importer.registerEventHandler(
32 SyncParser.prototype.syncWaitEvent.bind(this));
33 importer.registerEventHandler(
35 SyncParser.prototype.syncPtEvent.bind(this));
36 this.model_ = importer.model_;
39 var syncTimelineRE = /name=(\S+) value=(\S*)/;
40 var syncWaitRE = /(\S+) name=(\S+) state=(\d+)/;
41 var syncPtRE = /name=(\S+) value=(\S*)/;
43 SyncParser.prototype = {
44 __proto__: Parser.prototype,
47 * Parses sync events and sets up state in the importer.
49 timelineEvent: function(eventName, cpuNumber, pid,
51 var event = syncTimelineRE.exec(eventBase.details);
55 var thread = this.importer.getOrCreatePseudoThread(event[1]);
57 if (thread.lastActiveTs !== undefined) {
58 var duration = ts - thread.lastActiveTs;
59 var value = thread.lastActiveValue;
60 if (value == undefined)
62 var slice = new tracing.trace_model.Slice(
64 tvcm.ui.getStringColorId(value),
65 thread.lastActiveTs, {},
67 thread.thread.sliceGroup.pushSlice(slice);
69 thread.lastActiveTs = ts;
70 thread.lastActiveValue = event[2];
74 syncWaitEvent: function(eventName, cpuNumber, pid, ts,
76 var event = syncWaitRE.exec(eventBase.details);
80 if (eventBase.tgid === undefined) {
84 var tgid = parseInt(eventBase.tgid);
85 var thread = this.model_.getOrCreateProcess(tgid)
86 .getOrCreateThread(pid);
87 thread.name = eventBase.threadName;
88 var slices = thread.kernelSliceGroup;
89 if (!slices.isTimestampValidForBeginOrEnd(ts)) {
90 this.model_.importWarning({
92 message: 'Timestamps are moving backward.'
97 var name = 'fence_wait("' + event[2] + '")';
98 if (event[1] == 'begin') {
99 var slice = slices.beginSlice(null, name, ts, {
100 'Start state': event[3]
102 } else if (event[1] == 'end') {
103 if (slices.openSliceCount > 0) {
113 syncPtEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
114 var event = syncPtRE.exec(eventBase.details);
120 var thread = this.importer.getOrCreateKernelThread(
121 eventBase[1]).thread;
122 thread.syncWaitSyncPts[event[1]] = event[2];
127 Parser.registerSubtype(SyncParser);
130 SyncParser: SyncParser