• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2011 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
5var SocketPoolWrapper = (function() {
6  'use strict';
7
8  /**
9   * SocketPoolWrapper is a wrapper around socket pools entries.  It's
10   * used by the log and sockets view to print tables containing both
11   * a synopsis of the state of all pools, and listing the groups within
12   * individual pools.
13   *
14   * The constructor takes a socket pool and its parent, and generates a
15   * unique name from the two, which is stored as |fullName|.  |parent|
16   * must itself be a SocketPoolWrapper.
17   *
18   * @constructor
19   */
20  function SocketPoolWrapper(socketPool, parent) {
21    this.origPool = socketPool;
22    this.fullName = socketPool.name;
23    if (this.fullName != socketPool.type)
24      this.fullName += ' (' + socketPool.type + ')';
25    if (parent)
26      this.fullName = parent.fullName + '->' + this.fullName;
27  }
28
29  /**
30   * Returns an array of SocketPoolWrappers created from each of the socket
31   * pools in |socketPoolInfo|.  Nested socket pools appear immediately after
32   * their parent, and groups of nodes from trees with root nodes with the same
33   * id are placed adjacent to each other.
34   */
35  SocketPoolWrapper.createArrayFrom = function(socketPoolInfo) {
36    // Create SocketPoolWrappers for each socket pool and separate socket pools
37    // them into different arrays based on root node name.
38    var socketPoolGroups = [];
39    var socketPoolNameLists = {};
40    for (var i = 0; i < socketPoolInfo.length; ++i) {
41      var name = socketPoolInfo[i].name;
42      if (!socketPoolNameLists[name]) {
43        socketPoolNameLists[name] = [];
44        socketPoolGroups.push(socketPoolNameLists[name]);
45      }
46      addSocketPoolsToList(socketPoolNameLists[name], socketPoolInfo[i], null);
47    }
48
49    // Merge the arrays.
50    var socketPoolList = [];
51    for (var i = 0; i < socketPoolGroups.length; ++i) {
52      socketPoolList = socketPoolList.concat(socketPoolGroups[i]);
53    }
54    return socketPoolList;
55  };
56
57  /**
58   * Recursively creates SocketPoolWrappers from |origPool| and all its
59   * children and adds them all to |socketPoolList|.  |parent| is the
60   * SocketPoolWrapper for the parent of |origPool|, or null, if it's
61   * a top level socket pool.
62   */
63  function addSocketPoolsToList(socketPoolList, origPool, 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        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   */
79  SocketPoolWrapper.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 =
98          tablePrinter.addCell(origPool.connecting_socket_count);
99
100      if (origPool.groups) {
101        var idleSources = [];
102        var connectingSources = [];
103        for (var groupName in origPool.groups) {
104          var group = origPool.groups[groupName];
105          idleSources = idleSources.concat(group.idle_sockets);
106          connectingSources = connectingSources.concat(group.connect_jobs);
107        }
108        idleCell.link = sourceListLink(idleSources);
109        connectingCell.link = 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  SocketPoolWrapper.prototype = {
120    /**
121     * Returns a table printer containing information on all a
122     * socket pool's groups.
123     */
124    createGroupTablePrinter: function() {
125      var tablePrinter = new TablePrinter();
126      tablePrinter.setTitle(this.fullName);
127
128      tablePrinter.addHeaderCell('Name');
129      tablePrinter.addHeaderCell('Pending');
130      tablePrinter.addHeaderCell('Top Priority');
131      tablePrinter.addHeaderCell('Active');
132      tablePrinter.addHeaderCell('Idle');
133      tablePrinter.addHeaderCell('Connect Jobs');
134      tablePrinter.addHeaderCell('Backup Timer');
135      tablePrinter.addHeaderCell('Stalled');
136
137      for (var groupName in this.origPool.groups) {
138        var group = this.origPool.groups[groupName];
139
140        tablePrinter.addRow();
141        tablePrinter.addCell(groupName);
142        tablePrinter.addCell(group.pending_request_count);
143        if (group.top_pending_priority != undefined)
144          tablePrinter.addCell(group.top_pending_priority);
145        else
146          tablePrinter.addCell('-');
147
148        tablePrinter.addCell(group.active_socket_count);
149        var idleCell = tablePrinter.addCell(group.idle_sockets.length);
150        var connectingCell = tablePrinter.addCell(group.connect_jobs.length);
151
152        idleCell.link = sourceListLink(group.idle_sockets);
153        connectingCell.link = sourceListLink(group.connect_jobs);
154
155        tablePrinter.addCell(
156            group.backup_job_timer_is_running ? 'started' : 'stopped');
157        tablePrinter.addCell(group.is_stalled);
158      }
159      return tablePrinter;
160    }
161  };
162
163  /**
164   * Takes in a list of source IDs and returns a link that will select the
165   * specified sources.
166   */
167  function sourceListLink(sources) {
168    if (!sources.length)
169      return null;
170    return '#events&q=id:' + sources.join(',');
171  }
172
173  return SocketPoolWrapper;
174})();
175