13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 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"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/observer_list.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/process_util.h"
20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string16.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/timer.h"
22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/renderer_host/web_cache_manager.h"
23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "net/url_request/url_request_job_tracker.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h"
25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass Extension;
27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass SkBitmap;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TabContentsWrapper;
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerModel;
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace base {
32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass ProcessMetrics;
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This class is a singleton.
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManager {
37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // A resource represents one row in the task manager.
39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Resources from similar processes are grouped together by the task manager.
40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class Resource {
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual ~Resource() {}
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    enum Type {
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UNKNOWN = 0,     // An unknown process type.
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      BROWSER,         // The main browser process.
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      RENDERER,        // A normal TabContents renderer process.
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      EXTENSION,       // An extension or app process.
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NOTIFICATION,    // A notification process.
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      PLUGIN,          // A plugin process.
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      WORKER,          // A web worker process.
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NACL,            // A NativeClient loader or broker process.
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      UTILITY,         // A browser utility process.
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      PROFILE_IMPORT,  // A profile import process.
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      ZYGOTE,          // A Linux zygote process.
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      SANDBOX_HELPER,  // A sandbox helper process.
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      GPU              // A graphics process.
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    };
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    virtual string16 GetTitle() const = 0;
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual SkBitmap GetIcon() const = 0;
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual base::ProcessHandle GetProcess() const = 0;
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    virtual Type GetType() const = 0;
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsCacheStats() const { return false; }
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual WebKit::WebCache::ResourceTypeStats GetWebCoreCacheStats() const {
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      return WebKit::WebCache::ResourceTypeStats();
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    }
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsSqliteMemoryUsed() const { return false; }
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t SqliteMemoryUsedBytes() const { return 0; }
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Return extension associated with the resource, or NULL
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // if not applicable.
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual const Extension* GetExtension() const { return NULL; }
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool ReportsV8MemoryStats() const { return false; }
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t GetV8MemoryAllocated() const { return 0; }
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual size_t GetV8MemoryUsed() const { return 0; }
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // A helper function for ActivateFocusedTab.  Returns NULL by default
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // because not all resources have an associated tab.
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual TabContentsWrapper* GetTabContents() const { return NULL; }
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Whether this resource does report the network usage accurately.
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // This controls whether 0 or N/A is displayed when no bytes have been
87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // reported as being read. This is because some plugins do not report the
88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // bytes read and we don't want to display a misleading 0 value in that
89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // case.
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual bool SupportNetworkUsage() const = 0;
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Called when some bytes have been read and support_network_usage returns
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // false (meaning we do have network usage support).
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void SetSupportNetworkUsage() = 0;
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // The TaskManagerModel periodically refreshes its data and call this
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // on all live resources.
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void Refresh() {}
99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void NotifyResourceTypeStats(
101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        const WebKit::WebCache::ResourceTypeStats& stats) {}
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void NotifyV8HeapStats(size_t v8_memory_allocated,
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                   size_t v8_memory_used) {}
1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // Returns true if this resource is not visible to the user because it lives
1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    // in the background (e.g. extension background page, background contents).
1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    virtual bool IsBackground() const { return false; }
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // ResourceProviders are responsible for adding/removing resources to the task
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // manager. The task manager notifies the ResourceProvider that it is ready
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // to receive resource creation/termination notifications with a call to
113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // StartUpdating(). At that point, the resource provider should call
114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // AddResource with all the existing resources, and after that it should call
115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // AddResource/RemoveResource as resources are created/terminated.
116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The provider remains the owner of the resource objects and is responsible
117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // for deleting them (when StopUpdating() is called).
118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // After StopUpdating() is called the provider should also stop reporting
119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // notifications to the task manager.
120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Note: ResourceProviders have to be ref counted as they are used in
121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // MessageLoop::InvokeLater().
122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  class ResourceProvider : public base::RefCountedThreadSafe<ResourceProvider> {
123bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   public:
124bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // Should return the resource associated to the specified ids, or NULL if
125bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    // the resource does not belong to this provider.
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual TaskManager::Resource* GetResource(int process_id,
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int render_process_host_id,
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                               int routing_id) = 0;
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void StartUpdating() = 0;
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual void StopUpdating() = 0;
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen   protected:
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    friend class base::RefCountedThreadSafe<ResourceProvider>;
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
135bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    virtual ~ResourceProvider() {}
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static void RegisterPrefs(PrefService* prefs);
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if the process at the specified index is the browser process.
141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool IsBrowserProcess(int index) const;
142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Terminates the process at the specified index.
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void KillProcess(int index);
145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Activates the browser tab associated with the process in the specified
147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // index.
148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void ActivateProcess(int index);
149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // These methods are invoked by the resource providers to add/remove resources
151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // to the Task Manager. Note that the resources are owned by the
152bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // ResourceProviders and are not valid after StopUpdating() has been called
153bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // on the ResourceProviders.
154bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResource(Resource* resource);
155bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResource(Resource* resource);
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
157bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OnWindowClosed();
158bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
1594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Invoked when a change to a resource has occurred that should cause any
1604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // observers to completely refresh themselves (for example, the creation of
1614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // a background resource in a process). Results in all observers receiving
1624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // OnModelChanged() events.
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ModelChanged();
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the singleton instance (and initializes it if necessary).
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  static TaskManager* GetInstance();
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManagerModel* model() const { return model_.get(); }
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void OpenAboutMemory();
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
173bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Basic);
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, Resources);
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Init);
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest, Sort);
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerWindowControllerTest,
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                           SelectionAdaptsToSorting);
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Obtain an instance via GetInstance().
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TaskManager();
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend struct DefaultSingletonTraits<TaskManager>;
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~TaskManager();
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
187bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The model used for gathering and processing task data. It is ref counted
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // because it is passed as a parameter to MessageLoop::InvokeLater().
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<TaskManagerModel> model_;
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(TaskManager);
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass TaskManagerModelObserver {
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
196bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~TaskManagerModelObserver() {}
197bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when the model has been completely changed.
199bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnModelChanged() = 0;
200bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
201bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when a range of items has changed.
202bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsChanged(int start, int length) = 0;
203bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
204bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when new items are added.
205bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsAdded(int start, int length) = 0;
206bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
207bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Invoked when a range of items has been removed.
208bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void OnItemsRemoved(int start, int length) = 0;
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The model that the TaskManager is using.
21221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass TaskManagerModel : public net::URLRequestJobTracker::JobObserver,
213bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         public base::RefCountedThreadSafe<TaskManagerModel> {
214bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit TaskManagerModel(TaskManager* task_manager);
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
217bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddObserver(TaskManagerModelObserver* observer);
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveObserver(TaskManagerModelObserver* observer);
219bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
220bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns number of registered resources.
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int ResourceCount() const;
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Methods to return raw resource information.
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int64 GetNetworkUsage(int index) const;
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  double GetCPUUsage(int index) const;
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetProcessId(int index) const;
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Methods to return formatted resource information.
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceTitle(int index) const;
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceNetworkUsage(int index) const;
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceCPUUsage(int index) const;
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourcePrivateMemory(int index) const;
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceSharedMemory(int index) const;
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourcePhysicalMemory(int index) const;
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceProcessId(int index) const;
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreImageCacheSize(int index) const;
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreScriptsCacheSize(int index) const;
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceWebCoreCSSCacheSize(int index) const;
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceSqliteMemoryUsed(int index) const;
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceGoatsTeleported(int index) const;
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetResourceV8MemoryAllocatedSize(int index) const;
242bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the private memory (in bytes) that should be displayed for the passed
244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index. Caches the result since this calculation can take time on
245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // some platforms.
246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetPrivateMemory(int index, size_t* result) const;
247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the shared memory (in bytes) that should be displayed for the passed
249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index. Caches the result since this calculation can take time on
250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // some platforms.
251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetSharedMemory(int index, size_t* result) const;
252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the physical memory (in bytes) that should be displayed for the passed
254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource index.
255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetPhysicalMemory(int index, size_t* result) const;
256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the amount of memory allocated for javascript. Returns false if the
258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // resource for the given row isn't a renderer.
259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool GetV8Memory(int index, size_t* result) const;
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // See design doc at http://go/at-teleporter for more information.
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetGoatsTeleported(int index) const;
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
264bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if the resource is first in its group (resources
265bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // rendered by the same process are groupped together).
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool IsResourceFirstInGroup(int index) const;
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns true if the resource runs in the background (not visible to the
2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // user, e.g. extension background pages and BackgroundContents).
2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool IsBackgroundResource(int index) const;
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns icon to be used for resource (for example a favicon).
273bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SkBitmap GetResourceIcon(int index) const;
274bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
275bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns a pair (start, length) of the group range of resource.
276bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::pair<int, int> GetGroupRangeForResource(int index) const;
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Compares values in column |col_id| and rows |row1|, |row2|.
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns -1 if value in |row1| is less than value in |row2|,
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // 0 if they are equal, and 1 otherwise.
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int CompareValues(int row1, int row2, int col_id) const;
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns process handle for given resource.
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::ProcessHandle GetResourceProcessHandle(int index) const;
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the type of the given resource.
287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TaskManager::Resource::Type GetResourceType(int index) const;
288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns TabContents of given resource or NULL if not applicable.
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* GetResourceTabContents(int index) const;
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns Extension of given resource or NULL if not applicable.
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const Extension* GetResourceExtension(int index) const;
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // JobObserver methods:
29621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnJobAdded(net::URLRequestJob* job);
29721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnJobRemoved(net::URLRequestJob* job);
29821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnJobDone(net::URLRequestJob* job,
2993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                         const net::URLRequestStatus& status);
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnJobRedirect(net::URLRequestJob* job,
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                             const GURL& location,
30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                             int status_code);
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnBytesRead(net::URLRequestJob* job,
30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                           const char* buf,
30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                           int byte_count);
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddResource(TaskManager::Resource* resource);
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveResource(TaskManager::Resource* resource);
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StartUpdating();
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void StopUpdating();
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Clear();  // Removes all items.
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
3154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Sends OnModelChanged() to all observers to inform them of significant
3164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // changes to the model.
3174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ModelChanged();
3184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void NotifyResourceTypeStats(
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        base::ProcessId renderer_id,
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        const WebKit::WebCache::ResourceTypeStats& stats);
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void NotifyV8HeapStats(base::ProcessId renderer_id,
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         size_t v8_memory_allocated,
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         size_t v8_memory_used);
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  friend class base::RefCountedThreadSafe<TaskManagerModel>;
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled);
330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  FRIEND_TEST_ALL_PREFIXES(ExtensionApiTest, ProcessesVsTaskManager);
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~TaskManagerModel();
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  enum UpdateState {
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    IDLE = 0,      // Currently not updating.
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    TASK_PENDING,  // An update task is pending.
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    STOPPING       // A update task is pending and it should stop the update.
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // This struct is used to exchange information between the io and ui threads.
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  struct BytesReadParam {
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    BytesReadParam(int origin_pid,
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int render_process_host_child_id,
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int routing_id,
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   int byte_count)
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        : origin_pid(origin_pid),
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          render_process_host_child_id(render_process_host_child_id),
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          routing_id(routing_id),
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          byte_count(byte_count) {}
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // The process ID that triggered the request.  For plugin requests this
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // will differ from the renderer process ID.
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    int origin_pid;
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // The child ID of the RenderProcessHost this request was routed through.
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int render_process_host_child_id;
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int routing_id;
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    int byte_count;
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  };
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::vector<TaskManager::Resource*> ResourceList;
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::vector<TaskManager::ResourceProvider*> ResourceProviderList;
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, ResourceList*> GroupMap;
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, base::ProcessMetrics*> MetricsMap;
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle, double> CPUUsageMap;
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<TaskManager::Resource*, int64> ResourceValueMap;
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  typedef std::map<base::ProcessHandle,
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                   std::pair<size_t, size_t> > MemoryUsageMap;
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Updates the values for all rows.
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void Refresh();
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void AddItem(TaskManager::Resource* resource, bool notify_table);
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RemoveItem(TaskManager::Resource* resource);
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Register for network usage updates
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void RegisterForJobDoneNotifications();
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void UnregisterForJobDoneNotifications();
380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the network usage (in bytes per seconds) for the specified
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource. That's the value retrieved at the last timer's tick.
383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int64 GetNetworkUsageForResource(TaskManager::Resource* resource) const;
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Called on the UI thread when some bytes are read.
386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void BytesRead(BytesReadParam param);
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the network usage (in byte per second) that should be displayed for
389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the passed |resource|.  -1 means the information is not available for that
390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource.
391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int64 GetNetworkUsage(TaskManager::Resource* resource) const;
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns the CPU usage (in %) that should be displayed for the passed
394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // |resource|.
395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  double GetCPUUsage(TaskManager::Resource* resource) const;
396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Retrieves the ProcessMetrics for the resources at the specified row.
398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Returns true if there was a ProcessMetrics available.
399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool GetProcessMetricsForRow(int row,
400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                               base::ProcessMetrics** proc_metrics) const;
401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Given a number, this function returns the formatted string that should be
403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // displayed in the task manager's memory cell.
404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  string16 GetMemCellText(int64 number) const;
405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Looks up the data for |handle| and puts it in the mutable cache
407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // |memory_usage_map_|.
408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bool GetAndCacheMemoryMetrics(base::ProcessHandle handle,
409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                std::pair<size_t, size_t>* usage) const;
410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds a resource provider to be managed.
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void AddResourceProvider(TaskManager::ResourceProvider* provider);
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian 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