1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
8 * @fileoverview Parses sync events in the Linux event trace format.
10 tvcm.require('tracing.importer.linux_perf.parser');
11 tvcm.exportTo('tracing.importer.linux_perf', function() {
13 var Parser = tracing.importer.linux_perf.Parser;
16 * Parses linux sync trace events.
19 function SyncParser(importer) {
20 Parser.call(this, importer);
22 importer.registerEventHandler(
24 SyncParser.prototype.timelineEvent.bind(this));
25 importer.registerEventHandler(
27 SyncParser.prototype.syncWaitEvent.bind(this));
28 importer.registerEventHandler(
30 SyncParser.prototype.syncPtEvent.bind(this));
31 this.model_ = importer.model_;
34 var syncTimelineRE = /name=(\S+) value=(\S*)/;
35 var syncWaitRE = /(\S+) name=(\S+) state=(\d+)/;
36 var syncPtRE = /name=(\S+) value=(\S*)/;
38 SyncParser.prototype = {
39 __proto__: Parser.prototype,
42 * Parses sync events and sets up state in the importer.
44 timelineEvent: function(eventName, cpuNumber, pid,
46 var event = syncTimelineRE.exec(eventBase.details);
50 var thread = this.importer.getOrCreatePseudoThread(event[1]);
52 if (thread.lastActiveTs !== undefined) {
53 var duration = ts - thread.lastActiveTs;
54 var value = thread.lastActiveValue;
55 if (value == undefined)
57 var slice = new tracing.trace_model.Slice(
59 tracing.getStringColorId(value),
60 thread.lastActiveTs, {},
62 thread.thread.sliceGroup.pushSlice(slice);
64 thread.lastActiveTs = ts;
65 thread.lastActiveValue = event[2];
69 syncWaitEvent: function(eventName, cpuNumber, pid, ts,
71 var event = syncWaitRE.exec(eventBase.details);
75 if (eventBase.tgid === undefined) {
79 var tgid = parseInt(eventBase.tgid);
80 var thread = this.model_.getOrCreateProcess(tgid)
81 .getOrCreateThread(pid);
82 thread.name = eventBase.threadName;
83 var slices = thread.kernelSliceGroup;
84 if (!slices.isTimestampValidForBeginOrEnd(ts)) {
85 this.model_.importWarning({
87 message: 'Timestamps are moving backward.'
92 var name = 'fence_wait("' + event[2] + '")';
93 if (event[1] == 'begin') {
94 var slice = slices.beginSlice(null, name, ts, {
95 'Start state': event[3]
97 } else if (event[1] == 'end') {
98 if (slices.openSliceCount > 0) {
108 syncPtEvent: function(eventName, cpuNumber, pid, ts, eventBase) {
109 var event = syncPtRE.exec(eventBase.details);
115 var thread = this.importer.getOrCreateKernelThread(
116 eventBase[1]).thread;
117 thread.syncWaitSyncPts[event[1]] = event[2];
122 Parser.registerSubtype(SyncParser);
125 SyncParser: SyncParser