| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2015 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/base/iteration_helpers.html"> |
| <link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.exportTo('pi.m', function() { |
| function ThreadGrouping() { |
| this.groupNameForThreadGUID_ = {}; |
| } |
| |
| ThreadGrouping.prototype = { |
| autoInitUsingHelpers: function(model) { |
| // Everything is 'other' by default. |
| model.getAllThreads().forEach(function(thread) { |
| this.groupNameForThreadGUID_[thread.guid] = 'Other'; |
| }, this); |
| var chromeHelper = model.getOrCreateHelper( |
| tr.model.helpers.ChromeModelHelper); |
| |
| if (chromeHelper) { |
| var browserHelper = chromeHelper.browserHelper; |
| this.addThreadsInProcessToGroup_(browserHelper.process, 'Browser'); |
| |
| var gpuHelper = chromeHelper.gpuHelper; |
| if (gpuHelper) { |
| this.addThreadsInProcessToGroup_(gpuHelper.process, 'GPU'); |
| } |
| |
| for (var pid in chromeHelper.rendererHelpers) { |
| var rendererHelper = chromeHelper.rendererHelpers[pid]; |
| this.addThreadsInProcessToGroup_(rendererHelper.process, 'Renderer'); |
| } |
| |
| // TODO(nduca): Modify the helpers to detect plugin processes |
| // and include those in separate processes. |
| } |
| |
| // It would be very easy to add processes recognized by android helper |
| // here, too. |
| }, |
| |
| getGroupNameForThread: function(thread) { |
| if (!(thread instanceof tr.model.EventContainer)) |
| return 'error'; |
| |
| var groupName = this.groupNameForThreadGUID_[thread.guid]; |
| if (groupName === undefined) |
| return 'Other'; |
| return groupName; |
| }, |
| |
| getGroupNameForEvent: function(event) { |
| var parentContainer = event.parentContainer; |
| if (parentContainer === undefined) |
| return 'Unknown'; |
| return this.getGroupNameForThread(parentContainer); |
| }, |
| |
| addThreadsInProcessToGroup_: function(process, groupName, |
| opt_predicate, opt_this) { |
| var predicate = opt_predicate || tr.b.identity; |
| |
| for (var tid in process.threads) { |
| var thread = process.threads[tid]; |
| if (predicate.call(opt_this, thread)) |
| this.groupNameForThreadGUID_[thread.guid] = groupName; |
| } |
| }, |
| |
| divideEventSetIntoSubGroups: function(eventSet) { |
| var resultingEventSets = { |
| other: new tr.model.EventSet() |
| }; |
| tr.b.iterItems(this.groupNameForThreadGUID_, function(guid, groupName) { |
| if (resultingEventSets[groupName] !== undefined) |
| return; |
| resultingEventSets[groupName] = new tr.model.EventSet(); |
| }); |
| |
| eventSet.forEach(function(event) { |
| var parentContainer = event.parentContainer; |
| if (parentContainer === undefined) |
| return; |
| |
| if (!(parentContainer instanceof tr.model.EventContainer)) |
| return; |
| |
| var groupName = this.groupNameForThreadGUID_[parentContainer.guid]; |
| if (groupName === undefined) |
| groupName = 'Other'; |
| resultingEventSets[groupName].push(event); |
| |
| }, this); |
| |
| return resultingEventSets; |
| } |
| }; |
| |
| return { |
| ThreadGrouping: ThreadGrouping |
| }; |
| }); |
| </script> |