blob: facaa3b1923997df9d3e7905bc3c5b22b36d5da9 [file] [log] [blame]
<!DOCTYPE html>
<!--
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.
-->
<link rel="import" href="/tracing/model/process_base.html">
<link rel="import" href="/tracing/model/process_memory_dump.html">
<script>
'use strict';
/**
* @fileoverview Provides the Process class.
*/
tr.exportTo('tr.model', function() {
const ProcessBase = tr.model.ProcessBase;
const ProcessInstantEvent = tr.model.ProcessInstantEvent;
const Frame = tr.model.Frame;
const ProcessMemoryDump = tr.model.ProcessMemoryDump;
/**
* The Process represents a single userland process in the
* trace.
* @constructor
*/
function Process(model, pid) {
if (model === undefined) {
throw new Error('model must be provided');
}
if (pid === undefined) {
throw new Error('pid must be provided');
}
tr.model.ProcessBase.call(this, model);
this.pid = pid;
this.name = undefined;
this.labels = [];
this.uptime_seconds = 0;
this.instantEvents = [];
this.memoryDumps = [];
this.frames = [];
this.activities = [];
}
/**
* Comparison between processes that orders by pid.
*/
Process.compare = function(x, y) {
let tmp = tr.model.ProcessBase.compare(x, y);
if (tmp) return tmp;
if (x.name !== undefined) {
if (y.name !== undefined) {
tmp = x.name.localeCompare(y.name);
} else {
tmp = -1;
}
} else if (y.name !== undefined) {
tmp = 1;
}
if (tmp) return tmp;
tmp = tr.b.compareArrays(x.labels, y.labels,
function(x, y) { return x.localeCompare(y); });
if (tmp) return tmp;
return x.pid - y.pid;
};
Process.prototype = {
__proto__: tr.model.ProcessBase.prototype,
get stableId() {
return this.pid;
},
compareTo(that) {
return Process.compare(this, that);
},
* childEvents() {
yield* ProcessBase.prototype.childEvents.call(this);
yield* this.instantEvents;
yield* this.frames;
yield* this.memoryDumps;
},
addLabelIfNeeded(labelName) {
for (let i = 0; i < this.labels.length; i++) {
if (this.labels[i] === labelName) return;
}
this.labels.push(labelName);
},
get userFriendlyName() {
let res;
if (this.name) {
res = this.name + ' (pid ' + this.pid + ')';
} else {
res = 'Process ' + this.pid;
}
if (this.labels.length) {
res += ': ' + this.labels.join(', ');
}
if (this.uptime_seconds) {
res += ', uptime:' + this.uptime_seconds + 's';
}
return res;
},
get userFriendlyDetails() {
if (this.name) {
return this.name + ' (pid ' + this.pid + ')';
}
return 'pid: ' + this.pid;
},
getSettingsKey() {
if (!this.name) return undefined;
if (!this.labels.length) return 'processes.' + this.name;
return 'processes.' + this.name + '.' + this.labels.join('.');
},
shiftTimestampsForward(amount) {
for (let i = 0; i < this.instantEvents.length; i++) {
this.instantEvents[i].start += amount;
}
for (let i = 0; i < this.frames.length; i++) {
this.frames[i].shiftTimestampsForward(amount);
}
for (let i = 0; i < this.memoryDumps.length; i++) {
this.memoryDumps[i].shiftTimestampsForward(amount);
}
for (let i = 0; i < this.activities.length; i++) {
this.activities[i].shiftTimestampsForward(amount);
}
tr.model.ProcessBase.prototype
.shiftTimestampsForward.apply(this, arguments);
},
updateBounds() {
tr.model.ProcessBase.prototype.updateBounds.apply(this);
for (let i = 0; i < this.frames.length; i++) {
this.frames[i].addBoundsToRange(this.bounds);
}
for (let i = 0; i < this.memoryDumps.length; i++) {
this.memoryDumps[i].addBoundsToRange(this.bounds);
}
for (let i = 0; i < this.activities.length; i++) {
this.activities[i].addBoundsToRange(this.bounds);
}
},
sortMemoryDumps() {
this.memoryDumps.sort(function(x, y) {
return x.start - y.start;
});
tr.model.ProcessMemoryDump.hookUpMostRecentVmRegionsLinks(
this.memoryDumps);
}
};
return {
Process,
};
});
</script>