// 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 }; });