1// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5/** 6 * SocketPoolWrapper is a wrapper around socket pools entries. It's 7 * used by the log and sockets view to print tables containing both 8 * a synopsis of the state of all pools, and listing the groups within 9 * individual pools. 10 * 11 * The constructor takes a socket pool and its parent, and generates a 12 * unique name from the two, which is stored as |fullName|. |parent| 13 * must itself be a SocketPoolWrapper. 14 * 15 * @constructor 16 */ 17function SocketPoolWrapper(socketPool, parent) { 18 this.origPool = socketPool; 19 this.fullName = socketPool.name; 20 if (this.fullName != socketPool.type) 21 this.fullName += ' (' + socketPool.type + ')'; 22 if (parent) 23 this.fullName = parent.fullName + '->' + this.fullName; 24} 25 26/** 27 * Returns an array of SocketPoolWrappers created from each of the socket pools 28 * in |socketPoolInfo|. Nested socket pools appear immediately after their 29 * parent, and groups of nodes from trees with root nodes with the same id are 30 * placed adjacent to each other. 31 */ 32SocketPoolWrapper.createArrayFrom = function(socketPoolInfo) { 33 // Create SocketPoolWrappers for each socket pool and separate socket pools 34 // them into different arrays based on root node name. 35 var socketPoolGroups = []; 36 var socketPoolNameLists = {}; 37 for (var i = 0; i < socketPoolInfo.length; ++i) { 38 var name = socketPoolInfo[i].name; 39 if (!socketPoolNameLists[name]) { 40 socketPoolNameLists[name] = []; 41 socketPoolGroups.push(socketPoolNameLists[name]); 42 } 43 SocketPoolWrapper.addSocketPoolsToList_(socketPoolNameLists[name], 44 socketPoolInfo[i], null); 45 } 46 47 // Merge the arrays. 48 var socketPoolList = []; 49 for (var i = 0; i < socketPoolGroups.length; ++i) { 50 socketPoolList = socketPoolList.concat(socketPoolGroups[i]); 51 } 52 return socketPoolList; 53}; 54 55/** 56 * Recursively creates SocketPoolWrappers from |origPool| and all its 57 * children and adds them all to |socketPoolList|. |parent| is the 58 * SocketPoolWrapper for the parent of |origPool|, or null, if it's 59 * a top level socket pool. 60 */ 61SocketPoolWrapper.addSocketPoolsToList_ = function(socketPoolList, 62 origPool, 63 parent) { 64 var socketPool = new SocketPoolWrapper(origPool, parent); 65 socketPoolList.push(socketPool); 66 if (origPool.nested_pools) { 67 for (var i = 0; i < origPool.nested_pools.length; ++i) { 68 SocketPoolWrapper.addSocketPoolsToList_(socketPoolList, 69 origPool.nested_pools[i], 70 socketPool); 71 } 72 } 73}; 74 75/** 76 * Returns a table printer containing information on each 77 * SocketPoolWrapper in |socketPools|. 78 */ 79SocketPoolWrapper.createTablePrinter = function(socketPools) { 80 var tablePrinter = new TablePrinter(); 81 tablePrinter.addHeaderCell('Name'); 82 tablePrinter.addHeaderCell('Handed Out'); 83 tablePrinter.addHeaderCell('Idle'); 84 tablePrinter.addHeaderCell('Connecting'); 85 tablePrinter.addHeaderCell('Max'); 86 tablePrinter.addHeaderCell('Max Per Group'); 87 tablePrinter.addHeaderCell('Generation'); 88 89 for (var i = 0; i < socketPools.length; i++) { 90 var origPool = socketPools[i].origPool; 91 92 tablePrinter.addRow(); 93 tablePrinter.addCell(socketPools[i].fullName); 94 95 tablePrinter.addCell(origPool.handed_out_socket_count); 96 var idleCell = tablePrinter.addCell(origPool.idle_socket_count); 97 var connectingCell = tablePrinter.addCell(origPool.connecting_socket_count); 98 99 if (origPool.groups) { 100 var idleSources = []; 101 var connectingSources = []; 102 for (var groupName in origPool.groups) { 103 var group = origPool.groups[groupName]; 104 idleSources = idleSources.concat(group.idle_sockets); 105 connectingSources = connectingSources.concat(group.connect_jobs); 106 } 107 idleCell.link = SocketPoolWrapper.sourceListLink(idleSources); 108 connectingCell.link = 109 SocketPoolWrapper.sourceListLink(connectingSources); 110 } 111 112 tablePrinter.addCell(origPool.max_socket_count); 113 tablePrinter.addCell(origPool.max_sockets_per_group); 114 tablePrinter.addCell(origPool.pool_generation_number); 115 } 116 return tablePrinter; 117}; 118 119/** 120 * Returns a table printer containing information on all a 121 * socket pool's groups. 122 */ 123SocketPoolWrapper.prototype.createGroupTablePrinter = function() { 124 var tablePrinter = new TablePrinter(); 125 tablePrinter.setTitle(this.fullName); 126 127 tablePrinter.addHeaderCell('Name'); 128 tablePrinter.addHeaderCell('Pending'); 129 tablePrinter.addHeaderCell('Top Priority'); 130 tablePrinter.addHeaderCell('Active'); 131 tablePrinter.addHeaderCell('Idle'); 132 tablePrinter.addHeaderCell('Connect Jobs'); 133 tablePrinter.addHeaderCell('Backup Job'); 134 tablePrinter.addHeaderCell('Stalled'); 135 136 for (var groupName in this.origPool.groups) { 137 var group = this.origPool.groups[groupName]; 138 139 tablePrinter.addRow(); 140 tablePrinter.addCell(groupName); 141 tablePrinter.addCell(group.pending_request_count); 142 if (group.top_pending_priority != undefined) 143 tablePrinter.addCell(group.top_pending_priority); 144 else 145 tablePrinter.addCell('-'); 146 147 tablePrinter.addCell(group.active_socket_count); 148 var idleCell = tablePrinter.addCell(group.idle_sockets.length); 149 var connectingCell = tablePrinter.addCell(group.connect_jobs.length); 150 151 idleCell.link = SocketPoolWrapper.sourceListLink(group.idle_sockets); 152 connectingCell.link = 153 SocketPoolWrapper.sourceListLink(group.connect_jobs); 154 155 tablePrinter.addCell(group.has_backup_job); 156 tablePrinter.addCell(group.is_stalled); 157 } 158 return tablePrinter; 159}; 160 161/** 162 * Takes in a list of source IDs and returns a link that will select the 163 * specified sources. 164 */ 165SocketPoolWrapper.sourceListLink = function(sources) { 166 if (!sources.length) 167 return null; 168 return '#events&q=id:' + sources.join('%20id:'); 169} 170