<!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>