blob: 6308075a3b85a8e5bdffcb39cd39854ed3dd559d [file] [log] [blame]
// Copyright (c) 2012 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 Provides the ProcessBase class.
*/
base.require('range');
base.require('guid');
base.require('model.thread');
base.require('model.counter');
base.exportTo('tracing.model', function() {
var Thread = tracing.model.Thread;
var Counter = tracing.model.Counter;
/**
* The ProcessBase is an partial base class, upon which Kernel
* and Process are built.
*
* @constructor
*/
function ProcessBase() {
this.guid_ = tracing.GUID.allocate();
this.threads = {};
this.counters = {};
this.bounds = new base.Range();
};
ProcessBase.prototype = {
/*
* @return {Number} A globally unique identifier for this counter.
*/
get guid() {
return this.guid_;
},
/**
* Gets the number of threads in this process.
*/
get numThreads() {
var n = 0;
for (var p in this.threads) {
n++;
}
return n;
},
/**
* Shifts all the timestamps inside this process forward by the amount
* specified.
*/
shiftTimestampsForward: function(amount) {
for (var tid in this.threads)
this.threads[tid].shiftTimestampsForward(amount);
for (var id in this.counters)
this.counters[id].shiftTimestampsForward(amount);
},
/**
* Closes any open slices.
*/
autoCloseOpenSlices: function(opt_maxTimestamp) {
for (var tid in this.threads) {
var thread = this.threads[tid];
thread.autoCloseOpenSlices(opt_maxTimestamp);
}
},
/**
* Merge slices from the kernel with those from userland for each thread.
*/
mergeKernelWithUserland: function() {
for (var tid in this.threads) {
var thread = this.threads[tid];
thread.mergeKernelWithUserland();
}
},
updateBounds: function() {
this.bounds.reset();
for (var tid in this.threads) {
this.threads[tid].updateBounds();
this.bounds.addRange(this.threads[tid].bounds);
}
for (var id in this.counters) {
this.counters[id].updateBounds();
this.bounds.addRange(this.counters[id].bounds);
}
},
addCategoriesToDict: function(categoriesDict) {
for (var tid in this.threads)
this.threads[tid].addCategoriesToDict(categoriesDict);
for (var id in this.counters)
categoriesDict[this.counters[id].category] = true;
},
/**
* @param {String} The name of the thread to find.
* @return {Array} An array of all the matched threads.
*/
findAllThreadsNamed: function(name) {
var namedThreads = [];
for (var tid in this.threads) {
var thread = this.threads[tid];
if (thread.name == name)
namedThreads.push(thread);
}
return namedThreads;
},
/**
* Removes threads from the process that are fully empty.
*/
pruneEmptyContainers: function() {
var threadsToKeep = {};
for (var tid in this.threads) {
var thread = this.threads[tid];
if (!thread.isEmpty)
threadsToKeep[tid] = thread;
}
this.threads = threadsToKeep;
},
/**
* @return {TimlineThread} The thread identified by tid on this process,
* creating it if it doesn't exist.
*/
getOrCreateThread: function(tid) {
if (!this.threads[tid])
this.threads[tid] = new Thread(this, tid);
return this.threads[tid];
},
/**
* @return {TimlineCounter} The counter on this process named 'name',
* creating it if it doesn't exist.
*/
getOrCreateCounter: function(cat, name) {
var id = cat + '.' + name;
if (!this.counters[id])
this.counters[id] = new Counter(this, id, cat, name);
return this.counters[id];
}
};
return {
ProcessBase: ProcessBase
};
});