blob: c5a10170008accb71ec3a21b87efab59a89309cf [file] [log] [blame]
[email protected]82916812012-02-21 04:14:171// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]a5d1e1e2010-09-23 19:34:125#ifndef CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_
6#define CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_
initial.commit09911bf2008-07-26 23:55:297
[email protected]b7937d5b2008-09-10 22:12:198#include <map>
[email protected]b7937d5b2008-09-10 22:12:199#include <vector>
10
[email protected]5d438dbad2009-04-30 08:59:3911#include "base/basictypes.h"
[email protected]20f5f8a32013-08-20 01:50:5812#include "base/callback_forward.h"
[email protected]a918f872010-06-01 14:30:5113#include "base/gtest_prod_util.h"
[email protected]3b63f8f42011-03-28 01:54:1514#include "base/memory/ref_counted.h"
15#include "base/memory/singleton.h"
[email protected]a754453c2009-07-15 20:32:5116#include "base/observer_list.h"
[email protected]9f0abdb2013-06-10 21:49:3417#include "base/strings/string16.h"
[email protected]cc86ccfe2013-06-28 00:10:5018#include "base/timer/timer.h"
[email protected]2c434b32009-03-19 06:27:4719#include "chrome/browser/renderer_host/web_cache_manager.h"
[email protected]b18943a2013-05-23 15:59:1520#include "chrome/browser/task_manager/resource_provider.h"
[email protected]ddeb0e8432012-12-21 07:27:5421#include "chrome/browser/ui/host_desktop.h"
[email protected]fb246af2012-08-18 03:11:4122#include "content/public/common/gpu_memory_stats.h"
[email protected]2255a9332013-06-17 05:12:3123#include "third_party/WebKit/public/web/WebCache.h"
initial.commit09911bf2008-07-26 23:55:2924
[email protected]b1de2c72013-02-06 02:45:4725class PrefRegistrySimple;
[email protected]0860b9b92009-05-11 18:49:1826class TaskManagerModel;
[email protected]2344ca52012-08-22 22:46:0527class TaskManagerModelGpuDataManagerObserver;
initial.commit09911bf2008-07-26 23:55:2928
[email protected]176aa482008-11-14 03:25:1529namespace base {
initial.commit09911bf2008-07-26 23:55:2930class ProcessMetrics;
31}
[email protected]1c321ee2012-05-21 03:02:3432
[email protected]7ed0e8c2012-07-19 23:17:0633namespace content {
34class WebContents;
35}
36
[email protected]1c321ee2012-05-21 03:02:3437namespace extensions {
38class Extension;
39}
40
[email protected]6280b5882012-06-05 21:56:4141namespace gfx {
42class ImageSkia;
43}
44
[email protected]8523ba52011-05-22 19:00:5845namespace net {
46class URLRequest;
47}
initial.commit09911bf2008-07-26 23:55:2948
initial.commit09911bf2008-07-26 23:55:2949// This class is a singleton.
[email protected]f9fdb072009-05-06 07:27:4050class TaskManager {
initial.commit09911bf2008-07-26 23:55:2951 public:
[email protected]b1de2c72013-02-06 02:45:4752 static void RegisterPrefs(PrefRegistrySimple* registry);
initial.commit09911bf2008-07-26 23:55:2953
[email protected]8f90afd72009-06-22 22:44:3854 // Returns true if the process at the specified index is the browser process.
55 bool IsBrowserProcess(int index) const;
initial.commit09911bf2008-07-26 23:55:2956
[email protected]8f90afd72009-06-22 22:44:3857 // Terminates the process at the specified index.
58 void KillProcess(int index);
initial.commit09911bf2008-07-26 23:55:2959
[email protected]8f90afd72009-06-22 22:44:3860 // Activates the browser tab associated with the process in the specified
61 // index.
62 void ActivateProcess(int index);
[email protected]b7937d5b2008-09-10 22:12:1963
initial.commit09911bf2008-07-26 23:55:2964 // These methods are invoked by the resource providers to add/remove resources
65 // to the Task Manager. Note that the resources are owned by the
66 // ResourceProviders and are not valid after StopUpdating() has been called
67 // on the ResourceProviders.
[email protected]b18943a2013-05-23 15:59:1568 void AddResource(task_manager::Resource* resource);
69 void RemoveResource(task_manager::Resource* resource);
initial.commit09911bf2008-07-26 23:55:2970
[email protected]9c5e4172009-05-27 08:46:2871 void OnWindowClosed();
72
[email protected]c43207e2010-11-15 18:09:5273 // Invoked when a change to a resource has occurred that should cause any
74 // observers to completely refresh themselves (for example, the creation of
75 // a background resource in a process). Results in all observers receiving
76 // OnModelChanged() events.
77 void ModelChanged();
78
[email protected]8f90afd72009-06-22 22:44:3879 // Returns the singleton instance (and initializes it if necessary).
80 static TaskManager* GetInstance();
81
82 TaskManagerModel* model() const { return model_.get(); }
83
[email protected]ddeb0e8432012-12-21 07:27:5484 void OpenAboutMemory(chrome::HostDesktopType desktop_type);
[email protected]8f0d1a22009-10-08 19:55:1485
initial.commit09911bf2008-07-26 23:55:2986 private:
[email protected]a918f872010-06-01 14:30:5187 FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Basic);
88 FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Resources);
89 FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
[email protected]5ec892c2010-07-29 20:19:4990 FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Init);
91 FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Sort);
[email protected]c1b7d8cca2010-08-07 23:07:5892 FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest,
93 SelectionAdaptsToSorting);
[email protected]1222cce2009-04-27 06:58:2794
initial.commit09911bf2008-07-26 23:55:2995 // Obtain an instance via GetInstance().
96 TaskManager();
[email protected]5d438dbad2009-04-30 08:59:3997 friend struct DefaultSingletonTraits<TaskManager>;
initial.commit09911bf2008-07-26 23:55:2998
99 ~TaskManager();
100
[email protected]0860b9b92009-05-11 18:49:18101 // The model used for gathering and processing task data. It is ref counted
102 // because it is passed as a parameter to MessageLoop::InvokeLater().
103 scoped_refptr<TaskManagerModel> model_;
initial.commit09911bf2008-07-26 23:55:29104
[email protected]bfac5ac2008-10-09 17:55:38105 DISALLOW_COPY_AND_ASSIGN(TaskManager);
initial.commit09911bf2008-07-26 23:55:29106};
107
[email protected]0860b9b92009-05-11 18:49:18108class TaskManagerModelObserver {
initial.commit09911bf2008-07-26 23:55:29109 public:
[email protected]0860b9b92009-05-11 18:49:18110 virtual ~TaskManagerModelObserver() {}
initial.commit09911bf2008-07-26 23:55:29111
[email protected]0860b9b92009-05-11 18:49:18112 // Invoked when the model has been completely changed.
113 virtual void OnModelChanged() = 0;
initial.commit09911bf2008-07-26 23:55:29114
[email protected]0860b9b92009-05-11 18:49:18115 // Invoked when a range of items has changed.
116 virtual void OnItemsChanged(int start, int length) = 0;
117
118 // Invoked when new items are added.
119 virtual void OnItemsAdded(int start, int length) = 0;
120
121 // Invoked when a range of items has been removed.
122 virtual void OnItemsRemoved(int start, int length) = 0;
[email protected]82916812012-02-21 04:14:17123
[email protected]350584cd2012-05-17 18:18:26124 // Invoked when a range of items is to be immediately removed. It differs
125 // from OnItemsRemoved by the fact that the item is still in the task manager,
126 // so it can be queried for and found.
127 virtual void OnItemsToBeRemoved(int start, int length) {}
128
[email protected]82916812012-02-21 04:14:17129 // Invoked when the initialization of the model has been finished and
130 // periodical updates is started. The first periodical update will be done
131 // in a few seconds. (depending on platform)
132 virtual void OnReadyPeriodicalUpdate() {}
[email protected]0860b9b92009-05-11 18:49:18133};
134
[email protected]b6eaebd72013-01-15 23:04:09135// The model used by TaskManager.
136//
[email protected]b18943a2013-05-23 15:59:15137// TaskManagerModel caches the values from all task_manager::Resources. This is
[email protected]b6eaebd72013-01-15 23:04:09138// done so the UI sees a consistant view of the resources until it is told a
139// value has been updated.
[email protected]8523ba52011-05-22 19:00:58140class TaskManagerModel : public base::RefCountedThreadSafe<TaskManagerModel> {
[email protected]0860b9b92009-05-11 18:49:18141 public:
[email protected]abd81a522012-03-02 16:12:45142 // (start, length)
143 typedef std::pair<int, int> GroupRange;
144
[email protected]0860b9b92009-05-11 18:49:18145 explicit TaskManagerModel(TaskManager* task_manager);
[email protected]0860b9b92009-05-11 18:49:18146
[email protected]a754453c2009-07-15 20:32:51147 void AddObserver(TaskManagerModelObserver* observer);
148 void RemoveObserver(TaskManagerModelObserver* observer);
[email protected]0860b9b92009-05-11 18:49:18149
150 // Returns number of registered resources.
151 int ResourceCount() const;
[email protected]9f5d3e182011-07-11 06:22:29152 // Returns number of registered groups.
153 int GroupCount() const;
[email protected]0860b9b92009-05-11 18:49:18154
[email protected]8a661f82010-10-19 21:47:11155 // Methods to return raw resource information.
156 int64 GetNetworkUsage(int index) const;
157 double GetCPUUsage(int index) const;
[email protected]b6eaebd72013-01-15 23:04:09158 base::ProcessId GetProcessId(int index) const;
[email protected]350584cd2012-05-17 18:18:26159 base::ProcessHandle GetProcess(int index) const;
[email protected]ef72ae02011-10-28 16:28:59160 int GetResourceUniqueId(int index) const;
[email protected]28989c32011-12-14 19:41:36161 // Returns the index of resource that has the given |unique_id|. Returns -1 if
162 // no resouce has the |unique_id|.
163 int GetResourceIndexByUniqueId(const int unique_id) const;
[email protected]8a661f82010-10-19 21:47:11164
[email protected]36cdba02013-01-12 20:16:40165 // Catchall method that calls off to the appropriate GetResourceXXX method
166 // based on |col_id|. |col_id| is an IDS_ value used to identify the column.
[email protected]0085863a2013-12-06 21:19:03167 base::string16 GetResourceById(int index, int col_id) const;
[email protected]36cdba02013-01-12 20:16:40168
[email protected]0860b9b92009-05-11 18:49:18169 // Methods to return formatted resource information.
[email protected]0085863a2013-12-06 21:19:03170 const base::string16& GetResourceTitle(int index) const;
171 const base::string16& GetResourceProfileName(int index) const;
172 base::string16 GetResourceNetworkUsage(int index) const;
173 base::string16 GetResourceCPUUsage(int index) const;
174 base::string16 GetResourcePrivateMemory(int index) const;
175 base::string16 GetResourceSharedMemory(int index) const;
176 base::string16 GetResourcePhysicalMemory(int index) const;
177 base::string16 GetResourceProcessId(int index) const;
178 base::string16 GetResourceGDIHandles(int index) const;
179 base::string16 GetResourceUSERHandles(int index) const;
180 base::string16 GetResourceWebCoreImageCacheSize(int index) const;
181 base::string16 GetResourceWebCoreScriptsCacheSize(int index) const;
182 base::string16 GetResourceWebCoreCSSCacheSize(int index) const;
183 base::string16 GetResourceVideoMemory(int index) const;
184 base::string16 GetResourceFPS(int index) const;
185 base::string16 GetResourceSqliteMemoryUsed(int index) const;
186 base::string16 GetResourceGoatsTeleported(int index) const;
187 base::string16 GetResourceV8MemoryAllocatedSize(int index) const;
[email protected]0860b9b92009-05-11 18:49:18188
[email protected]8a661f82010-10-19 21:47:11189 // Gets the private memory (in bytes) that should be displayed for the passed
190 // resource index. Caches the result since this calculation can take time on
191 // some platforms.
192 bool GetPrivateMemory(int index, size_t* result) const;
193
194 // Gets the shared memory (in bytes) that should be displayed for the passed
195 // resource index. Caches the result since this calculation can take time on
196 // some platforms.
197 bool GetSharedMemory(int index, size_t* result) const;
198
199 // Gets the physical memory (in bytes) that should be displayed for the passed
200 // resource index.
201 bool GetPhysicalMemory(int index, size_t* result) const;
202
[email protected]f2937472013-03-18 21:48:34203 // On Windows, get the current and peak number of GDI handles in use.
204 void GetGDIHandles(int index, size_t* current, size_t* peak) const;
205
206 // On Windows, get the current and peak number of USER handles in use.
207 void GetUSERHandles(int index, size_t* current, size_t* peak) const;
208
[email protected]5d8c0b92011-07-21 07:53:32209 // Gets the statuses of webkit. Return false if the resource for the given row
210 // isn't a renderer.
211 bool GetWebCoreCacheStats(int index,
[email protected]a1221aea2013-11-07 01:31:30212 blink::WebCache::ResourceTypeStats* result) const;
[email protected]5d8c0b92011-07-21 07:53:32213
[email protected]fb246af2012-08-18 03:11:41214 // Gets the GPU memory allocated of the given page.
215 bool GetVideoMemory(int index,
216 size_t* video_memory,
217 bool* has_duplicates) const;
218
[email protected]5d8c0b92011-07-21 07:53:32219 // Gets the fps of the given page. Return false if the resource for the given
220 // row isn't a renderer.
221 bool GetFPS(int index, float* result) const;
222
223 // Gets the sqlite memory (in byte). Return false if the resource for the
224 // given row doesn't report information.
225 bool GetSqliteMemoryUsedBytes(int index, size_t* result) const;
226
[email protected]8a661f82010-10-19 21:47:11227 // Gets the amount of memory allocated for javascript. Returns false if the
228 // resource for the given row isn't a renderer.
229 bool GetV8Memory(int index, size_t* result) const;
230
[email protected]350584cd2012-05-17 18:18:26231 // Gets the amount of memory used for javascript. Returns false if the
232 // resource for the given row isn't a renderer.
233 bool GetV8MemoryUsed(int index, size_t* result) const;
234
[email protected]374bf592011-11-10 15:42:18235 // Returns true if resource for the given row can be activated.
236 bool CanActivate(int index) const;
237
[email protected]0f62bb2d2011-10-26 14:48:33238 // Returns true if resource for the given row can be inspected using developer
239 // tools.
240 bool CanInspect(int index) const;
241
242 // Invokes or reveals developer tools window for resource in the given row.
243 void Inspect(int index) const;
244
[email protected]8a661f82010-10-19 21:47:11245 // See design doc at http://go/at-teleporter for more information.
246 int GetGoatsTeleported(int index) const;
247
[email protected]9f5d3e182011-07-11 06:22:29248 // Returns true if the resource is first/last in its group (resources
[email protected]0860b9b92009-05-11 18:49:18249 // rendered by the same process are groupped together).
250 bool IsResourceFirstInGroup(int index) const;
[email protected]9f5d3e182011-07-11 06:22:29251 bool IsResourceLastInGroup(int index) const;
[email protected]0860b9b92009-05-11 18:49:18252
[email protected]c43207e2010-11-15 18:09:52253 // Returns true if the resource runs in the background (not visible to the
254 // user, e.g. extension background pages and BackgroundContents).
255 bool IsBackgroundResource(int index) const;
256
[email protected]0860b9b92009-05-11 18:49:18257 // Returns icon to be used for resource (for example a favicon).
[email protected]6280b5882012-06-05 21:56:41258 gfx::ImageSkia GetResourceIcon(int index) const;
[email protected]0860b9b92009-05-11 18:49:18259
[email protected]abd81a522012-03-02 16:12:45260 // Returns the group range of resource.
261 GroupRange GetGroupRangeForResource(int index) const;
[email protected]0860b9b92009-05-11 18:49:18262
[email protected]9f5d3e182011-07-11 06:22:29263 // Returns an index of groups to which the resource belongs.
264 int GetGroupIndexForResource(int index) const;
265
266 // Returns an index of resource which belongs to the |group_index|th group
267 // and which is the |index_in_group|th resource in group.
268 int GetResourceIndexForGroup(int group_index, int index_in_group) const;
269
[email protected]0860b9b92009-05-11 18:49:18270 // Compares values in column |col_id| and rows |row1|, |row2|.
271 // Returns -1 if value in |row1| is less than value in |row2|,
272 // 0 if they are equal, and 1 otherwise.
273 int CompareValues(int row1, int row2, int col_id) const;
274
[email protected]6bfb6e702012-04-05 17:18:22275 // Returns the unique child process ID generated by Chromium, not the OS
276 // process id. This is used to identify processes internally and for
277 // extensions. It is not meant to be displayed to the user.
278 int GetUniqueChildProcessId(int index) const;
279
[email protected]8a661f82010-10-19 21:47:11280 // Returns the type of the given resource.
[email protected]b18943a2013-05-23 15:59:15281 task_manager::Resource::Type GetResourceType(int index) const;
[email protected]8a661f82010-10-19 21:47:11282
[email protected]7ed0e8c2012-07-19 23:17:06283 // Returns WebContents of given resource or NULL if not applicable.
284 content::WebContents* GetResourceWebContents(int index) const;
initial.commit09911bf2008-07-26 23:55:29285
[email protected]e1725842009-10-20 06:40:15286 // Returns Extension of given resource or NULL if not applicable.
[email protected]1c321ee2012-05-21 03:02:34287 const extensions::Extension* GetResourceExtension(int index) const;
[email protected]e1725842009-10-20 06:40:15288
[email protected]b18943a2013-05-23 15:59:15289 void AddResource(task_manager::Resource* resource);
290 void RemoveResource(task_manager::Resource* resource);
initial.commit09911bf2008-07-26 23:55:29291
[email protected]0860b9b92009-05-11 18:49:18292 void StartUpdating();
293 void StopUpdating();
initial.commit09911bf2008-07-26 23:55:29294
[email protected]350584cd2012-05-17 18:18:26295 // Listening involves calling StartUpdating on all resource providers. This
296 // causes all of them to subscribe to notifications and enumerate current
297 // resources. It differs from StartUpdating that it doesn't start the
298 // Refresh timer. The end result is that we have a full view of resources, but
299 // don't spend unneeded time updating, unless we have a real need to.
300 void StartListening();
301 void StopListening();
302
[email protected]0860b9b92009-05-11 18:49:18303 void Clear(); // Removes all items.
304
[email protected]c43207e2010-11-15 18:09:52305 // Sends OnModelChanged() to all observers to inform them of significant
306 // changes to the model.
307 void ModelChanged();
308
[email protected]156402ab2013-09-04 21:12:31309 // Updates the values for all rows.
310 void Refresh();
311
[email protected]ec9773682009-09-25 17:59:03312 void NotifyResourceTypeStats(
[email protected]38b48a82009-11-11 01:51:32313 base::ProcessId renderer_id,
[email protected]a1221aea2013-11-07 01:31:30314 const blink::WebCache::ResourceTypeStats& stats);
[email protected]ec9773682009-09-25 17:59:03315
[email protected]872ae5b2011-05-26 20:20:50316 void NotifyFPS(base::ProcessId renderer_id,
317 int routing_id,
318 float fps);
319
[email protected]fb246af2012-08-18 03:11:41320 void NotifyVideoMemoryUsageStats(
321 const content::GPUVideoMemoryUsageStats& video_memory_usage_stats);
322
[email protected]38b48a82009-11-11 01:51:32323 void NotifyV8HeapStats(base::ProcessId renderer_id,
324 size_t v8_memory_allocated,
325 size_t v8_memory_used);
326
[email protected]8523ba52011-05-22 19:00:58327 void NotifyBytesRead(const net::URLRequest& request, int bytes_read);
328
[email protected]20f5f8a32013-08-20 01:50:58329 void RegisterOnDataReadyCallback(const base::Closure& callback);
330
331 void NotifyDataReady();
332
[email protected]0860b9b92009-05-11 18:49:18333 private:
[email protected]e6e6ba42009-11-07 01:56:19334 friend class base::RefCountedThreadSafe<TaskManagerModel>;
[email protected]c4a9d852013-09-26 17:10:36335 friend class TaskManagerNoShowBrowserTest;
[email protected]8a661f82010-10-19 21:47:11336 FRIEND_TEST_ALL_PREFIXES(ExtensionApiTest, ProcessesVsTaskManager);
[email protected]b6eaebd72013-01-15 23:04:09337 FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
338 FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest,
339 SelectionAdaptsToSorting);
[email protected]e6e6ba42009-11-07 01:56:19340
[email protected]bfac5ac2008-10-09 17:55:38341 enum UpdateState {
342 IDLE = 0, // Currently not updating.
343 TASK_PENDING, // An update task is pending.
344 STOPPING // A update task is pending and it should stop the update.
345 };
346
[email protected]a9bd323d2013-06-17 20:27:56347 // The delay between updates of the information (in ms).
348#if defined(OS_MACOSX)
349 // Match Activity Monitor's default refresh rate.
350 static const int kUpdateTimeMs = 2000;
351#else
352 static const int kUpdateTimeMs = 1000;
353#endif
354
[email protected]b6eaebd72013-01-15 23:04:09355 // Values cached per resource. Values are validated on demand. The is_XXX
356 // members indicate if a value is valid.
357 struct PerResourceValues {
358 PerResourceValues();
359 ~PerResourceValues();
360
361 bool is_title_valid;
[email protected]0085863a2013-12-06 21:19:03362 base::string16 title;
[email protected]b6eaebd72013-01-15 23:04:09363
364 bool is_profile_name_valid;
[email protected]0085863a2013-12-06 21:19:03365 base::string16 profile_name;
[email protected]b6eaebd72013-01-15 23:04:09366
367 // No is_network_usage since default (0) is fine.
368 int64 network_usage;
369
370 bool is_process_id_valid;
371 base::ProcessId process_id;
372
373 bool is_goats_teleported_valid;
374 int goats_teleported;
375
376 bool is_webcore_stats_valid;
[email protected]a1221aea2013-11-07 01:31:30377 blink::WebCache::ResourceTypeStats webcore_stats;
[email protected]b6eaebd72013-01-15 23:04:09378
379 bool is_fps_valid;
380 float fps;
381
382 bool is_sqlite_memory_bytes_valid;
383 size_t sqlite_memory_bytes;
384
385 bool is_v8_memory_valid;
386 size_t v8_memory_allocated;
387 size_t v8_memory_used;
388 };
389
390 // Values cached per process. Values are validated on demand. The is_XXX
391 // members indicate if a value is valid.
392 struct PerProcessValues {
393 PerProcessValues();
394 ~PerProcessValues();
395
396 bool is_cpu_usage_valid;
397 double cpu_usage;
398
399 bool is_private_and_shared_valid;
400 size_t private_bytes;
401 size_t shared_bytes;
402
403 bool is_physical_memory_valid;
404 size_t physical_memory;
405
406 bool is_video_memory_valid;
407 size_t video_memory;
408 bool video_memory_has_duplicates;
[email protected]f2937472013-03-18 21:48:34409
410 bool is_gdi_handles_valid;
411 size_t gdi_handles;
412 size_t gdi_handles_peak;
413
414 bool is_user_handles_valid;
415 size_t user_handles;
416 size_t user_handles_peak;
[email protected]b6eaebd72013-01-15 23:04:09417 };
418
[email protected]b18943a2013-05-23 15:59:15419 typedef std::vector<task_manager::Resource*> ResourceList;
420 typedef std::vector<scoped_refptr<task_manager::ResourceProvider> >
[email protected]b6eaebd72013-01-15 23:04:09421 ResourceProviderList;
422 typedef std::map<base::ProcessHandle, ResourceList*> GroupMap;
423 typedef std::map<base::ProcessHandle, base::ProcessMetrics*> MetricsMap;
[email protected]b18943a2013-05-23 15:59:15424 typedef std::map<task_manager::Resource*, int64> ResourceValueMap;
425 typedef std::map<task_manager::Resource*,
[email protected]b6eaebd72013-01-15 23:04:09426 PerResourceValues> PerResourceCache;
427 typedef std::map<base::ProcessHandle, PerProcessValues> PerProcessCache;
428
initial.commit09911bf2008-07-26 23:55:29429 // This struct is used to exchange information between the io and ui threads.
430 struct BytesReadParam {
[email protected]cdf682e2011-02-05 05:11:28431 BytesReadParam(int origin_pid,
[email protected]3b490c82014-01-03 00:17:47432 int child_id,
433 int route_id,
[email protected]76543b92009-08-31 17:27:45434 int byte_count)
[email protected]cdf682e2011-02-05 05:11:28435 : origin_pid(origin_pid),
[email protected]3b490c82014-01-03 00:17:47436 child_id(child_id),
437 route_id(route_id),
[email protected]76543b92009-08-31 17:27:45438 byte_count(byte_count) {}
initial.commit09911bf2008-07-26 23:55:29439
[email protected]cdf682e2011-02-05 05:11:28440 // The process ID that triggered the request. For plugin requests this
441 // will differ from the renderer process ID.
442 int origin_pid;
[email protected]76543b92009-08-31 17:27:45443
[email protected]3b490c82014-01-03 00:17:47444 // The child ID of the process this request was routed through.
445 int child_id;
[email protected]76543b92009-08-31 17:27:45446
[email protected]3b490c82014-01-03 00:17:47447 int route_id;
initial.commit09911bf2008-07-26 23:55:29448 int byte_count;
449 };
450
[email protected]b6eaebd72013-01-15 23:04:09451 ~TaskManagerModel();
initial.commit09911bf2008-07-26 23:55:29452
[email protected]b6eaebd72013-01-15 23:04:09453 // Callback from the timer to refresh. Invokes Refresh() as appropriate.
454 void RefreshCallback();
455
[email protected]fb246af2012-08-18 03:11:41456 void RefreshVideoMemoryUsageStats();
457
initial.commit09911bf2008-07-26 23:55:29458 // Returns the network usage (in bytes per seconds) for the specified
459 // resource. That's the value retrieved at the last timer's tick.
[email protected]b18943a2013-05-23 15:59:15460 int64 GetNetworkUsageForResource(task_manager::Resource* resource) const;
initial.commit09911bf2008-07-26 23:55:29461
initial.commit09911bf2008-07-26 23:55:29462 // Called on the UI thread when some bytes are read.
463 void BytesRead(BytesReadParam param);
464
[email protected]f173d152012-10-17 21:02:41465 void MultipleBytesRead(const std::vector<BytesReadParam>* params);
466
467 // Notifies the UI thread about all the bytes read. Allows for coalescing
468 // multiple bytes read into a single task for the UI thread. This is important
469 // for when downloading a lot of data on the IO thread, since posting a Task
470 // for each one is expensive.
471 void NotifyMultipleBytesRead();
472
[email protected]bfac5ac2008-10-09 17:55:38473 // Returns the network usage (in byte per second) that should be displayed for
474 // the passed |resource|. -1 means the information is not available for that
475 // resource.
[email protected]b18943a2013-05-23 15:59:15476 int64 GetNetworkUsage(task_manager::Resource* resource) const;
[email protected]bfac5ac2008-10-09 17:55:38477
478 // Returns the CPU usage (in %) that should be displayed for the passed
479 // |resource|.
[email protected]b18943a2013-05-23 15:59:15480 double GetCPUUsage(task_manager::Resource* resource) const;
[email protected]bfac5ac2008-10-09 17:55:38481
[email protected]d0767cb542009-10-08 17:38:30482 // Given a number, this function returns the formatted string that should be
483 // displayed in the task manager's memory cell.
[email protected]0085863a2013-12-06 21:19:03484 base::string16 GetMemCellText(int64 number) const;
[email protected]2a5af8a2009-01-23 23:13:05485
[email protected]b6eaebd72013-01-15 23:04:09486 // Verifies the private and shared memory for |handle| is valid in
487 // |per_process_cache_|. Returns true if the data in |per_process_cache_| is
488 // valid.
489 bool CachePrivateAndSharedMemory(base::ProcessHandle handle) const;
490
491 // Verifies |webcore_stats| in |per_resource_cache_|, returning true on
492 // success.
493 bool CacheWebCoreStats(int index) const;
494
495 // Verifies |v8_memory_allocated| and |v8_memory_used| in
496 // |per_resource_cache_|. Returns true if valid, false if not valid.
497 bool CacheV8Memory(int index) const;
[email protected]98947a02010-05-11 17:46:08498
[email protected]0f4ffe842011-03-30 18:59:46499 // Adds a resource provider to be managed.
[email protected]b18943a2013-05-23 15:59:15500 void AddResourceProvider(task_manager::ResourceProvider* provider);
[email protected]0f4ffe842011-03-30 18:59:46501
[email protected]b6eaebd72013-01-15 23:04:09502 // Returns the PerResourceValues for the specified index.
503 PerResourceValues& GetPerResourceValues(int index) const;
504
505 // Returns the Resource for the specified index.
[email protected]b18943a2013-05-23 15:59:15506 task_manager::Resource* GetResource(int index) const;
[email protected]b6eaebd72013-01-15 23:04:09507
initial.commit09911bf2008-07-26 23:55:29508 // The list of providers to the task manager. They are ref counted.
509 ResourceProviderList providers_;
510
511 // The list of all the resources displayed in the task manager. They are owned
512 // by the ResourceProviders.
513 ResourceList resources_;
514
515 // A map to keep tracks of the grouped resources (they are grouped if they
516 // share the same process). The groups (the Resources vectors) are owned by
517 // the model (but the actual Resources are owned by the ResourceProviders).
518 GroupMap group_map_;
519
520 // A map to retrieve the process metrics for a process. The ProcessMetrics are
521 // owned by the model.
522 MetricsMap metrics_map_;
523
524 // A map that keeps track of the number of bytes read per process since last
525 // tick. The Resources are owned by the ResourceProviders.
526 ResourceValueMap current_byte_count_map_;
527
[email protected]fb246af2012-08-18 03:11:41528 // A map that contains the video memory usage for a process
529 content::GPUVideoMemoryUsageStats video_memory_usage_stats_;
[email protected]b6eaebd72013-01-15 23:04:09530
531 // Set to true when we've requested video stats and false once we get them.
[email protected]fb246af2012-08-18 03:11:41532 bool pending_video_memory_usage_stats_update_;
533
[email protected]2344ca52012-08-22 22:46:05534 // An observer waiting for video memory usage stats updates from the GPU
535 // process
536 scoped_ptr<TaskManagerModelGpuDataManagerObserver>
537 video_memory_usage_stats_observer_;
538
[email protected]a754453c2009-07-15 20:32:51539 ObserverList<TaskManagerModelObserver> observer_list_;
initial.commit09911bf2008-07-26 23:55:29540
[email protected]8a661f82010-10-19 21:47:11541 // How many calls to StartUpdating have been made without matching calls to
542 // StopUpdating.
543 int update_requests_;
544
[email protected]350584cd2012-05-17 18:18:26545 // How many calls to StartListening have been made without matching calls to
546 // StopListening.
547 int listen_requests_;
548
[email protected]bfac5ac2008-10-09 17:55:38549 // Whether we are currently in the process of updating.
550 UpdateState update_state_;
551
[email protected]96373d02010-04-21 01:16:14552 // A salt lick for the goats.
[email protected]abd81a522012-03-02 16:12:45553 uint64 goat_salt_;
[email protected]96373d02010-04-21 01:16:14554
[email protected]ef72ae02011-10-28 16:28:59555 // Resource identifier that is unique within single session.
556 int last_unique_id_;
557
[email protected]f173d152012-10-17 21:02:41558 // Buffer for coalescing BytesReadParam so we don't have to post a task on
559 // each NotifyBytesRead() call.
560 std::vector<BytesReadParam> bytes_read_buffer_;
561
[email protected]20f5f8a32013-08-20 01:50:58562 std::vector<base::Closure> on_data_ready_callbacks_;
563
[email protected]b6eaebd72013-01-15 23:04:09564 // All per-Resource values are stored here.
565 mutable PerResourceCache per_resource_cache_;
566
567 // All per-Process values are stored here.
568 mutable PerProcessCache per_process_cache_;
569
[email protected]0860b9b92009-05-11 18:49:18570 DISALLOW_COPY_AND_ASSIGN(TaskManagerModel);
initial.commit09911bf2008-07-26 23:55:29571};
572
[email protected]a5d1e1e2010-09-23 19:34:12573#endif // CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_