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