188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// Copyright (c) 2012 The Chromium Authors. All rights reserved. 288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// Use of this source code is governed by a BSD-style license that can be 388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown// found in the LICENSE file. 488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown'use strict'; 688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown/** 888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @fileoverview Provides the ProcessBase class. 988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.guid'); 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.range'); 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.trace_model.counter'); 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.trace_model.object_collection'); 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.trace_model.thread'); 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.trace_model_settings'); 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.trace_model', function() { 1788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var Thread = tracing.trace_model.Thread; 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var Counter = tracing.trace_model.Counter; 2088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 2188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 2288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * The ProcessBase is an partial base class, upon which Kernel 2388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * and Process are built. 2488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * 2588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @constructor 2688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis function ProcessBase(model) { 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!model) 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new Error('Must provide a model'); 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.guid_ = base.GUID.allocate(); 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.model = model; 3288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads = {}; 3388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.counters = {}; 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects = new tracing.trace_model.ObjectCollection(this); 3588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.bounds = new base.Range(); 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.sortIndex = 0; 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.ephemeralSettings = {}; 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ProcessBase.compare = function(x, y) { 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return x.sortIndex - y.sortIndex; 4288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }; 4388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 4488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown ProcessBase.prototype = { 4588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /* 4688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @return {Number} A globally unique identifier for this counter. 4788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 4888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown get guid() { 4988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return this.guid_; 5088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 5188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 5288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 5388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Gets the number of threads in this process. 5488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 5588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown get numThreads() { 5688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var n = 0; 5788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var p in this.threads) { 5888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown n++; 5988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 6088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return n; 6188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 6288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis toJSON: function() { 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var obj = new Object(); 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var keys = Object.keys(this); 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 0; i < keys.length; i++) { 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var key = keys[i]; 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (typeof this[key] == 'function') 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis continue; 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (key == 'model') 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis continue; 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis obj[key] = this[key]; 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return obj; 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 7888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Shifts all the timestamps inside this process forward by the amount 7988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * specified. 8088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 8188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown shiftTimestampsForward: function(amount) { 8288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) 8388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads[tid].shiftTimestampsForward(amount); 8488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var id in this.counters) 8588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.counters[id].shiftTimestampsForward(amount); 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.shiftTimestampsForward(amount); 8788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 8888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 8988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 9088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Closes any open slices. 9188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 9288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown autoCloseOpenSlices: function(opt_maxTimestamp) { 9388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) { 9488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var thread = this.threads[tid]; 9588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown thread.autoCloseOpenSlices(opt_maxTimestamp); 9688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 9706db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis }, 9806db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis autoDeleteObjects: function(maxTimestamp) { 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.autoDeleteObjects(maxTimestamp); 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Called by the model after finalizing imports, 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * but before joining refs. 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis preInitializeObjects: function() { 10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.preInitializeAllObjects(); 10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Called by the model after joining refs. 11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis initializeObjects: function() { 11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.initializeAllObjects(); 11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11806db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis /** 11906db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis * Merge slices from the kernel with those from userland for each thread. 12006db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis */ 12106db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis mergeKernelWithUserland: function() { 12206db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis for (var tid in this.threads) { 12306db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis var thread = this.threads[tid]; 12406db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis thread.mergeKernelWithUserland(); 12506db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis } 12688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 12788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 12888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown updateBounds: function() { 12988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.bounds.reset(); 13088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) { 13188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads[tid].updateBounds(); 13288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.bounds.addRange(this.threads[tid].bounds); 13388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 13488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var id in this.counters) { 13588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.counters[id].updateBounds(); 13688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.bounds.addRange(this.counters[id].bounds); 13788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.updateBounds(); 13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.bounds.addRange(this.objects.bounds); 14088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 14188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 14288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown addCategoriesToDict: function(categoriesDict) { 14388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) 14488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads[tid].addCategoriesToDict(categoriesDict); 14588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var id in this.counters) 14688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown categoriesDict[this.counters[id].category] = true; 14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.objects.addCategoriesToDict(categoriesDict); 14888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 14988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 15088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 15188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @param {String} The name of the thread to find. 15288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @return {Array} An array of all the matched threads. 15388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 15488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown findAllThreadsNamed: function(name) { 15588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var namedThreads = []; 15688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) { 15788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var thread = this.threads[tid]; 15888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown if (thread.name == name) 15988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown namedThreads.push(thread); 16088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 16188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return namedThreads; 16288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 16388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 16488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 16588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * Removes threads from the process that are fully empty. 16688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 16788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown pruneEmptyContainers: function() { 16888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var threadsToKeep = {}; 16988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown for (var tid in this.threads) { 17088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var thread = this.threads[tid]; 17188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown if (!thread.isEmpty) 17288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown threadsToKeep[tid] = thread; 17388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 17488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads = threadsToKeep; 17588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 17688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 17788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 17888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @return {TimlineThread} The thread identified by tid on this process, 17988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * creating it if it doesn't exist. 18088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 18188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown getOrCreateThread: function(tid) { 18288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown if (!this.threads[tid]) 18388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.threads[tid] = new Thread(this, tid); 18488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return this.threads[tid]; 18588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }, 18688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 18788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown /** 18888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * @return {TimlineCounter} The counter on this process named 'name', 18988448d9ae4dfff1805045790ef5f32495d62abccJeff Brown * creating it if it doesn't exist. 19088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown */ 19188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown getOrCreateCounter: function(cat, name) { 19288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown var id = cat + '.' + name; 19388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown if (!this.counters[id]) 19488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown this.counters[id] = new Counter(this, id, cat, name); 19588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return this.counters[id]; 19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis getSettingsKey: function() { 19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis throw new Error('Not implemented'); 20088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown } 20188448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }; 20288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown 20388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown return { 20488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown ProcessBase: ProcessBase 20588448d9ae4dfff1805045790ef5f32495d62abccJeff Brown }; 20688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown}); 207