task_manager.h revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#ifndef CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#define CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#pragma once
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <map>
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <utility>
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <vector>
13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/basictypes.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/gtest_prod_util.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/lock.h"
17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/observer_list.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/process_util.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/ref_counted.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/singleton.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string16.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/timer.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/web_cache_manager.h"
24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/url_request/url_request_job_tracker.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "third_party/WebKit/WebKit/chromium/public/WebCache.h"
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Extension;
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SkBitmap;
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TabContents;
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerModel;
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace base {
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ProcessMetrics;
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This class is a singleton.
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManager {
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A resource represents one row in the task manager.
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Resources from similar processes are grouped together by the task manager.
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class Resource {
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual ~Resource() {}
44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    enum Type {
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UNKNOWN = 0,     // An unknown process type.
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BROWSER,         // The main browser process.
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      RENDERER,        // A normal TabContents renderer process.
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      EXTENSION,       // An extension or app process.
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NOTIFICATION,    // A notification process.
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      PLUGIN,          // A plugin process.
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      WORKER,          // A web worker process.
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NACL,            // A NativeClient loader or broker process.
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UTILITY,         // A browser utility process.
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      PROFILE_IMPORT,  // A profile import process.
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ZYGOTE,          // A Linux zygote process.
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SANDBOX_HELPER,  // A sandbox helper process.
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GPU              // A graphics process.
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    };
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual std::wstring GetTitle() const = 0;
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual SkBitmap GetIcon() const = 0;
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual base::ProcessHandle GetProcess() const = 0;
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    virtual Type GetType() const = 0;
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsCacheStats() const { return false; }
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual WebKit::WebCache::ResourceTypeStats GetWebCoreCacheStats() const {
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return WebKit::WebCache::ResourceTypeStats();
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsSqliteMemoryUsed() const { return false; }
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t SqliteMemoryUsedBytes() const { return 0; }
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Return extension associated with the resource, or NULL
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // if not applicable.
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual const Extension* GetExtension() const { return NULL; }
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsV8MemoryStats() const { return false; }
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t GetV8MemoryAllocated() const { return 0; }
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t GetV8MemoryUsed() const { return 0; }
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // A helper function for ActivateFocusedTab.  Returns NULL by default
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // because not all resources have an associated tab.
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual TabContents* GetTabContents() const { return NULL; }
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Whether this resource does report the network usage accurately.
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This controls whether 0 or N/A is displayed when no bytes have been
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // reported as being read. This is because some plugins do not report the
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // bytes read and we don't want to display a misleading 0 value in that
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // case.
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool SupportNetworkUsage() const = 0;
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Called when some bytes have been read and support_network_usage returns
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // false (meaning we do have network usage support).
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void SetSupportNetworkUsage() = 0;
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // The TaskManagerModel periodically refreshes its data and call this
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // on all live resources.
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void Refresh() {}
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void NotifyResourceTypeStats(
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        const WebKit::WebCache::ResourceTypeStats& stats) {}
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void NotifyV8HeapStats(size_t v8_memory_allocated,
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                   size_t v8_memory_used) {}
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Returns true if this resource is not visible to the user because it lives
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // in the background (e.g. extension background page, background contents).
1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual bool IsBackground() const { return false; }
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // ResourceProviders are responsible for adding/removing resources to the task
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // manager. The task manager notifies the ResourceProvider that it is ready
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // to receive resource creation/termination notifications with a call to
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // StartUpdating(). At that point, the resource provider should call
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // AddResource with all the existing resources, and after that it should call
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // AddResource/RemoveResource as resources are created/terminated.
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The provider remains the owner of the resource objects and is responsible
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // for deleting them (when StopUpdating() is called).
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // After StopUpdating() is called the provider should also stop reporting
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // notifications to the task manager.
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Note: ResourceProviders have to be ref counted as they are used in
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // MessageLoop::InvokeLater().
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class ResourceProvider : public base::RefCountedThreadSafe<ResourceProvider> {
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Should return the resource associated to the specified ids, or NULL if
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the resource does not belong to this provider.
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual TaskManager::Resource* GetResource(int process_id,
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int render_process_host_id,
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int routing_id) = 0;
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void StartUpdating() = 0;
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void StopUpdating() = 0;
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   protected:
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    friend class base::RefCountedThreadSafe<ResourceProvider>;
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual ~ResourceProvider() {}
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static void RegisterPrefs(PrefService* prefs);
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if the process at the specified index is the browser process.
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool IsBrowserProcess(int index) const;
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Terminates the process at the specified index.
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void KillProcess(int index);
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Activates the browser tab associated with the process in the specified
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // index.
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void ActivateProcess(int index);
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResourceProvider(ResourceProvider* provider);
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResourceProvider(ResourceProvider* provider);
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // These methods are invoked by the resource providers to add/remove resources
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // to the Task Manager. Note that the resources are owned by the
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // ResourceProviders and are not valid after StopUpdating() has been called
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // on the ResourceProviders.
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResource(Resource* resource);
159bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResource(Resource* resource);
160bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnWindowClosed();
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when a change to a resource has occurred that should cause any
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // observers to completely refresh themselves (for example, the creation of
1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // a background resource in a process). Results in all observers receiving
1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // OnModelChanged() events.
1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ModelChanged();
1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the singleton instance (and initializes it if necessary).
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static TaskManager* GetInstance();
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerModel* model() const { return model_.get(); }
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OpenAboutMemory();
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Basic);
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Resources);
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Init);
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Sort);
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest,
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           SelectionAdaptsToSorting);
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Obtain an instance via GetInstance().
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManager();
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend struct DefaultSingletonTraits<TaskManager>;
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~TaskManager();
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The model used for gathering and processing task data. It is ref counted
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // because it is passed as a parameter to MessageLoop::InvokeLater().
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<TaskManagerModel> model_;
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(TaskManager);
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerModelObserver {
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~TaskManagerModelObserver() {}
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when the model has been completely changed.
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnModelChanged() = 0;
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when a range of items has changed.
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsChanged(int start, int length) = 0;
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when new items are added.
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsAdded(int start, int length) = 0;
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when a range of items has been removed.
212bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsRemoved(int start, int length) = 0;
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The model that the TaskManager is using.
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerModel : public URLRequestJobTracker::JobObserver,
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         public base::RefCountedThreadSafe<TaskManagerModel> {
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit TaskManagerModel(TaskManager* task_manager);
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddObserver(TaskManagerModelObserver* observer);
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveObserver(TaskManagerModelObserver* observer);
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns number of registered resources.
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int ResourceCount() const;
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Methods to return raw resource information.
228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int64 GetNetworkUsage(int index) const;
229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  double GetCPUUsage(int index) const;
230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetProcessId(int index) const;
231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Methods to return formatted resource information.
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceTitle(int index) const;
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceNetworkUsage(int index) const;
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceCPUUsage(int index) const;
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourcePrivateMemory(int index) const;
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceSharedMemory(int index) const;
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourcePhysicalMemory(int index) const;
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceProcessId(int index) const;
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreImageCacheSize(int index) const;
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreScriptsCacheSize(int index) const;
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreCSSCacheSize(int index) const;
243bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceSqliteMemoryUsed(int index) const;
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceGoatsTeleported(int index) const;
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceV8MemoryAllocatedSize(int index) const;
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the private memory (in bytes) that should be displayed for the passed
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index. Caches the result since this calculation can take time on
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // some platforms.
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetPrivateMemory(int index, size_t* result) const;
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the shared memory (in bytes) that should be displayed for the passed
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index. Caches the result since this calculation can take time on
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // some platforms.
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetSharedMemory(int index, size_t* result) const;
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the physical memory (in bytes) that should be displayed for the passed
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index.
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetPhysicalMemory(int index, size_t* result) const;
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the amount of memory allocated for javascript. Returns false if the
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource for the given row isn't a renderer.
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetV8Memory(int index, size_t* result) const;
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // See design doc at http://go/at-teleporter for more information.
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetGoatsTeleported(int index) const;
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if the resource is first in its group (resources
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // rendered by the same process are groupped together).
270bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool IsResourceFirstInGroup(int index) const;
271bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if the resource runs in the background (not visible to the
2734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // user, e.g. extension background pages and BackgroundContents).
2744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool IsBackgroundResource(int index) const;
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns icon to be used for resource (for example a favicon).
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SkBitmap GetResourceIcon(int index) const;
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns a pair (start, length) of the group range of resource.
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::pair<int, int> GetGroupRangeForResource(int index) const;
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Compares values in column |col_id| and rows |row1|, |row2|.
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns -1 if value in |row1| is less than value in |row2|,
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // 0 if they are equal, and 1 otherwise.
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int CompareValues(int row1, int row2, int col_id) const;
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns process handle for given resource.
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::ProcessHandle GetResourceProcessHandle(int index) const;
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the type of the given resource.
291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TaskManager::Resource::Type GetResourceType(int index) const;
292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns TabContents of given resource or NULL if not applicable.
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* GetResourceTabContents(int index) const;
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
296bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns Extension of given resource or NULL if not applicable.
297bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const Extension* GetResourceExtension(int index) const;
298bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
299bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // JobObserver methods:
300bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnJobAdded(URLRequestJob* job);
301bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnJobRemoved(URLRequestJob* job);
302bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnJobDone(URLRequestJob* job, const URLRequestStatus& status);
303bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnJobRedirect(URLRequestJob* job, const GURL& location, int status_code);
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnBytesRead(URLRequestJob* job, const char* buf, int byte_count);
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResourceProvider(TaskManager::ResourceProvider* provider);
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResourceProvider(TaskManager::ResourceProvider* provider);
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResource(TaskManager::Resource* resource);
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResource(TaskManager::Resource* resource);
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StartUpdating();
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StopUpdating();
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Clear();  // Removes all items.
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sends OnModelChanged() to all observers to inform them of significant
3184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // changes to the model.
3194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ModelChanged();
3204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void NotifyResourceTypeStats(
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        base::ProcessId renderer_id,
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        const WebKit::WebCache::ResourceTypeStats& stats);
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void NotifyV8HeapStats(base::ProcessId renderer_id,
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         size_t v8_memory_allocated,
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         size_t v8_memory_used);
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend class base::RefCountedThreadSafe<TaskManagerModel>;
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FRIEND_TEST_ALL_PREFIXES(ExtensionApiTest, ProcessesVsTaskManager);
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~TaskManagerModel();
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  enum UpdateState {
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDLE = 0,      // Currently not updating.
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TASK_PENDING,  // An update task is pending.
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    STOPPING       // A update task is pending and it should stop the update.
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // This struct is used to exchange information between the io and ui threads.
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  struct BytesReadParam {
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    BytesReadParam(int origin_child_id,
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int render_process_host_child_id,
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int routing_id,
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int byte_count)
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        : origin_child_id(origin_child_id),
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          render_process_host_child_id(render_process_host_child_id),
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          routing_id(routing_id),
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          byte_count(byte_count) {}
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This is the child ID of the originator of the request. It will often be
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the same as the render_process_host_child_id, but will be different when
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // another sub-process like a plugin is routing requests through a renderer.
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int origin_child_id;
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // The child ID of the RenderProcessHist this request was routed through.
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_child_id;
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id;
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int byte_count;
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::vector<TaskManager::Resource*> ResourceList;
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::vector<TaskManager::ResourceProvider*> ResourceProviderList;
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, ResourceList*> GroupMap;
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, base::ProcessMetrics*> MetricsMap;
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, double> CPUUsageMap;
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<TaskManager::Resource*, int64> ResourceValueMap;
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle,
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   std::pair<size_t, size_t> > MemoryUsageMap;
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Updates the values for all rows.
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Refresh();
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddItem(TaskManager::Resource* resource, bool notify_table);
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveItem(TaskManager::Resource* resource);
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Register for network usage updates
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RegisterForJobDoneNotifications();
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void UnregisterForJobDoneNotifications();
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the network usage (in bytes per seconds) for the specified
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource. That's the value retrieved at the last timer's tick.
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int64 GetNetworkUsageForResource(TaskManager::Resource* resource) const;
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Called on the UI thread when some bytes are read.
389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void BytesRead(BytesReadParam param);
390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the network usage (in byte per second) that should be displayed for
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the passed |resource|.  -1 means the information is not available for that
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource.
394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int64 GetNetworkUsage(TaskManager::Resource* resource) const;
395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the CPU usage (in %) that should be displayed for the passed
397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // |resource|.
398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  double GetCPUUsage(TaskManager::Resource* resource) const;
399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Retrieves the ProcessMetrics for the resources at the specified row.
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if there was a ProcessMetrics available.
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool GetProcessMetricsForRow(int row,
403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               base::ProcessMetrics** proc_metrics) const;
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Given a number, this function returns the formatted string that should be
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // displayed in the task manager's memory cell.
407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetMemCellText(int64 number) const;
408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Looks up the data for |handle| and puts it in the mutable cache
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // |memory_usage_map_|.
411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool GetAndCacheMemoryMetrics(base::ProcessHandle handle,
412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                std::pair<size_t, size_t>* usage) const;
413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The list of providers to the task manager. They are ref counted.
415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceProviderList providers_;
416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The list of all the resources displayed in the task manager. They are owned
418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // by the ResourceProviders.
419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceList resources_;
420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map to keep tracks of the grouped resources (they are grouped if they
422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // share the same process). The groups (the Resources vectors) are owned by
423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the model (but the actual Resources are owned by the ResourceProviders).
424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GroupMap group_map_;
425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map to retrieve the process metrics for a process. The ProcessMetrics are
427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // owned by the model.
428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  MetricsMap metrics_map_;
429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map that keeps track of the number of bytes read per process since last
431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // tick. The Resources are owned by the ResourceProviders.
432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceValueMap current_byte_count_map_;
433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map that contains the network usage is displayed in the table, in bytes
435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // per second. It is computed every time the timer ticks. The Resources are
436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // owned by the ResourceProviders.
437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ResourceValueMap displayed_network_usage_map_;
438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map that contains the CPU usage (in %) for a process since last refresh.
440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CPUUsageMap cpu_usage_map_;
441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A map that contains the private/shared memory usage of the process. We
443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // cache this because the same APIs are called on linux and windows, and
444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // because the linux call takes >10ms to complete. This cache is cleared on
445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // every Refresh().
446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  mutable MemoryUsageMap memory_usage_map_;
447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ObserverList<TaskManagerModelObserver> observer_list_;
449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // How many calls to StartUpdating have been made without matching calls to
451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // StopUpdating.
452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int update_requests_;
453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Whether we are currently in the process of updating.
455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  UpdateState update_state_;
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A salt lick for the goats.
458bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int goat_salt_;
459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(TaskManagerModel);
461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif  // CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_
464