// Copyright (c) 2010 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. /** * SocketPoolWrapper is a wrapper around socket pools entries. It's * used by the log and sockets view to print tables containing both * a synopsis of the state of all pools, and listing the groups within * individual pools. * * The constructor takes a socket pool and its parent, and generates a * unique name from the two, which is stored as |fullName|. |parent| * must itself be a SocketPoolWrapper. * * @constructor */ function SocketPoolWrapper(socketPool, parent) { this.origPool = socketPool; this.fullName = socketPool.name; if (this.fullName != socketPool.type) this.fullName += ' (' + socketPool.type + ')'; if (parent) this.fullName = parent.fullName + '->' + this.fullName; } /** * Returns an array of SocketPoolWrappers created from each of the socket pools * in |socketPoolInfo|. Nested socket pools appear immediately after their * parent, and groups of nodes from trees with root nodes with the same id are * placed adjacent to each other. */ SocketPoolWrapper.createArrayFrom = function(socketPoolInfo) { // Create SocketPoolWrappers for each socket pool and separate socket pools // them into different arrays based on root node name. var socketPoolGroups = []; var socketPoolNameLists = {}; for (var i = 0; i < socketPoolInfo.length; ++i) { var name = socketPoolInfo[i].name; if (!socketPoolNameLists[name]) { socketPoolNameLists[name] = []; socketPoolGroups.push(socketPoolNameLists[name]); } SocketPoolWrapper.addSocketPoolsToList_(socketPoolNameLists[name], socketPoolInfo[i], null); } // Merge the arrays. var socketPoolList = []; for (var i = 0; i < socketPoolGroups.length; ++i) { socketPoolList = socketPoolList.concat(socketPoolGroups[i]); } return socketPoolList; }; /** * Recursively creates SocketPoolWrappers from |origPool| and all its * children and adds them all to |socketPoolList|. |parent| is the * SocketPoolWrapper for the parent of |origPool|, or null, if it's * a top level socket pool. */ SocketPoolWrapper.addSocketPoolsToList_ = function(socketPoolList, origPool, parent) { var socketPool = new SocketPoolWrapper(origPool, parent); socketPoolList.push(socketPool); if (origPool.nested_pools) { for (var i = 0; i < origPool.nested_pools.length; ++i) { SocketPoolWrapper.addSocketPoolsToList_(socketPoolList, origPool.nested_pools[i], socketPool); } } }; /** * Returns a table printer containing information on each * SocketPoolWrapper in |socketPools|. */ SocketPoolWrapper.createTablePrinter = function(socketPools) { var tablePrinter = new TablePrinter(); tablePrinter.addHeaderCell('Name'); tablePrinter.addHeaderCell('Handed Out'); tablePrinter.addHeaderCell('Idle'); tablePrinter.addHeaderCell('Connecting'); tablePrinter.addHeaderCell('Max'); tablePrinter.addHeaderCell('Max Per Group'); tablePrinter.addHeaderCell('Generation'); for (var i = 0; i < socketPools.length; i++) { var origPool = socketPools[i].origPool; tablePrinter.addRow(); tablePrinter.addCell(socketPools[i].fullName); tablePrinter.addCell(origPool.handed_out_socket_count); var idleCell = tablePrinter.addCell(origPool.idle_socket_count); var connectingCell = tablePrinter.addCell(origPool.connecting_socket_count); if (origPool.groups) { var idleSources = []; var connectingSources = []; for (var groupName in origPool.groups) { var group = origPool.groups[groupName]; idleSources = idleSources.concat(group.idle_sockets); connectingSources = connectingSources.concat(group.connect_jobs); } idleCell.link = SocketPoolWrapper.sourceListLink(idleSources); connectingCell.link = SocketPoolWrapper.sourceListLink(connectingSources); } tablePrinter.addCell(origPool.max_socket_count); tablePrinter.addCell(origPool.max_sockets_per_group); tablePrinter.addCell(origPool.pool_generation_number); } return tablePrinter; }; /** * Returns a table printer containing information on all a * socket pool's groups. */ SocketPoolWrapper.prototype.createGroupTablePrinter = function() { var tablePrinter = new TablePrinter(); tablePrinter.setTitle(this.fullName); tablePrinter.addHeaderCell('Name'); tablePrinter.addHeaderCell('Pending'); tablePrinter.addHeaderCell('Top Priority'); tablePrinter.addHeaderCell('Active'); tablePrinter.addHeaderCell('Idle'); tablePrinter.addHeaderCell('Connect Jobs'); tablePrinter.addHeaderCell('Backup Job'); tablePrinter.addHeaderCell('Stalled'); for (var groupName in this.origPool.groups) { var group = this.origPool.groups[groupName]; tablePrinter.addRow(); tablePrinter.addCell(groupName); tablePrinter.addCell(group.pending_request_count); if (group.top_pending_priority != undefined) tablePrinter.addCell(group.top_pending_priority); else tablePrinter.addCell('-'); tablePrinter.addCell(group.active_socket_count); var idleCell = tablePrinter.addCell(group.idle_sockets.length); var connectingCell = tablePrinter.addCell(group.connect_jobs.length); idleCell.link = SocketPoolWrapper.sourceListLink(group.idle_sockets); connectingCell.link = SocketPoolWrapper.sourceListLink(group.connect_jobs); tablePrinter.addCell(group.has_backup_job); tablePrinter.addCell(group.is_stalled); } return tablePrinter; }; /** * Takes in a list of source IDs and returns a link that will select the * specified sources. */ SocketPoolWrapper.sourceListLink = function(sources) { if (!sources.length) return null; return '#events&q=id:' + sources.join('%20id:'); }