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