Index: netlog_viewer/socket_pool_wrapper.js |
diff --git a/netlog_viewer/socket_pool_wrapper.js b/netlog_viewer/socket_pool_wrapper.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..69cdb0511d7fc95a3ff72e1b11ab216ebaa497c3 |
--- /dev/null |
+++ b/netlog_viewer/socket_pool_wrapper.js |
@@ -0,0 +1,175 @@ |
+// Copyright (c) 2011 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. |
+ |
+var SocketPoolWrapper = (function() { |
+ 'use strict'; |
+ |
+ /** |
+ * 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]); |
+ } |
+ 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. |
+ */ |
+ function addSocketPoolsToList(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) { |
+ 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 = sourceListLink(idleSources); |
+ connectingCell.link = sourceListLink(connectingSources); |
+ } |
+ |
+ tablePrinter.addCell(origPool.max_socket_count); |
+ tablePrinter.addCell(origPool.max_sockets_per_group); |
+ tablePrinter.addCell(origPool.pool_generation_number); |
+ } |
+ return tablePrinter; |
+ }; |
+ |
+ SocketPoolWrapper.prototype = { |
+ /** |
+ * Returns a table printer containing information on all a |
+ * socket pool's groups. |
+ */ |
+ 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 Timer'); |
+ 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 = sourceListLink(group.idle_sockets); |
+ connectingCell.link = sourceListLink(group.connect_jobs); |
+ |
+ tablePrinter.addCell( |
+ group.backup_job_timer_is_running ? 'started' : 'stopped'); |
+ tablePrinter.addCell(group.is_stalled); |
+ } |
+ return tablePrinter; |
+ } |
+ }; |
+ |
+ /** |
+ * Takes in a list of source IDs and returns a link that will select the |
+ * specified sources. |
+ */ |
+ function sourceListLink(sources) { |
+ if (!sources.length) |
+ return null; |
+ return '#events&q=id:' + sources.join(','); |
+ } |
+ |
+ return SocketPoolWrapper; |
+})(); |
+ |