task_manager.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
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" 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. 21621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass TaskManagerModel : public net::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: 30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnJobAdded(net::URLRequestJob* job); 30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnJobRemoved(net::URLRequestJob* job); 30221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnJobDone(net::URLRequestJob* job, 3033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen const net::URLRequestStatus& status); 30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnJobRedirect(net::URLRequestJob* job, 30521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const GURL& location, 30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int status_code); 30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void OnBytesRead(net::URLRequestJob* job, 30821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* buf, 30921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int byte_count); 310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void AddResourceProvider(TaskManager::ResourceProvider* provider); 312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void RemoveResourceProvider(TaskManager::ResourceProvider* provider); 313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void AddResource(TaskManager::Resource* resource); 315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void RemoveResource(TaskManager::Resource* resource); 316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void StartUpdating(); 318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void StopUpdating(); 319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void Clear(); // Removes all items. 321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 3224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Sends OnModelChanged() to all observers to inform them of significant 3234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // changes to the model. 3244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void ModelChanged(); 3254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void NotifyResourceTypeStats( 327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::ProcessId renderer_id, 328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const WebKit::WebCache::ResourceTypeStats& stats); 329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void NotifyV8HeapStats(base::ProcessId renderer_id, 331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size_t v8_memory_allocated, 332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen size_t v8_memory_used); 333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private: 335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen friend class base::RefCountedThreadSafe<TaskManagerModel>; 336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen FRIEND_TEST_ALL_PREFIXES(TaskManagerTest, RefreshCalled); 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FRIEND_TEST_ALL_PREFIXES(ExtensionApiTest, ProcessesVsTaskManager); 338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ~TaskManagerModel(); 340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen enum UpdateState { 342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen IDLE = 0, // Currently not updating. 343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen TASK_PENDING, // An update task is pending. 344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen STOPPING // A update task is pending and it should stop the update. 345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen }; 346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // This struct is used to exchange information between the io and ui threads. 348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen struct BytesReadParam { 349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BytesReadParam(int origin_child_id, 350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_child_id, 351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id, 352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int byte_count) 353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : origin_child_id(origin_child_id), 354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen render_process_host_child_id(render_process_host_child_id), 355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen routing_id(routing_id), 356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen byte_count(byte_count) {} 357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // This is the child ID of the originator of the request. It will often be 359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the same as the render_process_host_child_id, but will be different when 360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // another sub-process like a plugin is routing requests through a renderer. 361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int origin_child_id; 362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The child ID of the RenderProcessHist this request was routed through. 364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int render_process_host_child_id; 365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int routing_id; 367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int byte_count; 368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen }; 369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::vector<TaskManager::Resource*> ResourceList; 371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::vector<TaskManager::ResourceProvider*> ResourceProviderList; 372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::map<base::ProcessHandle, ResourceList*> GroupMap; 373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::map<base::ProcessHandle, base::ProcessMetrics*> MetricsMap; 374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::map<base::ProcessHandle, double> CPUUsageMap; 375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::map<TaskManager::Resource*, int64> ResourceValueMap; 376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen typedef std::map<base::ProcessHandle, 377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::pair<size_t, size_t> > MemoryUsageMap; 378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Updates the values for all rows. 380bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void Refresh(); 381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void AddItem(TaskManager::Resource* resource, bool notify_table); 383bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void RemoveItem(TaskManager::Resource* resource); 384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Register for network usage updates 386bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void RegisterForJobDoneNotifications(); 387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void UnregisterForJobDoneNotifications(); 388bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 389bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns the network usage (in bytes per seconds) for the specified 390bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // resource. That's the value retrieved at the last timer's tick. 391bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 GetNetworkUsageForResource(TaskManager::Resource* resource) const; 392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Called on the UI thread when some bytes are read. 394bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen void BytesRead(BytesReadParam param); 395bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 396bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns the network usage (in byte per second) that should be displayed for 397bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the passed |resource|. -1 means the information is not available for that 398bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // resource. 399bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int64 GetNetworkUsage(TaskManager::Resource* resource) const; 400bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 401bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns the CPU usage (in %) that should be displayed for the passed 402bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // |resource|. 403bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen double GetCPUUsage(TaskManager::Resource* resource) const; 404bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 405bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Retrieves the ProcessMetrics for the resources at the specified row. 406bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Returns true if there was a ProcessMetrics available. 407bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool GetProcessMetricsForRow(int row, 408bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::ProcessMetrics** proc_metrics) const; 409bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 410bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Given a number, this function returns the formatted string that should be 411bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // displayed in the task manager's memory cell. 412bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen string16 GetMemCellText(int64 number) const; 413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 414bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Looks up the data for |handle| and puts it in the mutable cache 415bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // |memory_usage_map_|. 416bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool GetAndCacheMemoryMetrics(base::ProcessHandle handle, 417bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::pair<size_t, size_t>* usage) const; 418bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 419bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The list of providers to the task manager. They are ref counted. 420bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceProviderList providers_; 421bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // The list of all the resources displayed in the task manager. They are owned 423bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // by the ResourceProviders. 424bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceList resources_; 425bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 426bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map to keep tracks of the grouped resources (they are grouped if they 427bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // share the same process). The groups (the Resources vectors) are owned by 428bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // the model (but the actual Resources are owned by the ResourceProviders). 429bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen GroupMap group_map_; 430bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 431bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map to retrieve the process metrics for a process. The ProcessMetrics are 432bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // owned by the model. 433bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen MetricsMap metrics_map_; 434bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 435bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map that keeps track of the number of bytes read per process since last 436bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // tick. The Resources are owned by the ResourceProviders. 437bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceValueMap current_byte_count_map_; 438bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 439bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map that contains the network usage is displayed in the table, in bytes 440bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // per second. It is computed every time the timer ticks. The Resources are 441bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // owned by the ResourceProviders. 442bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ResourceValueMap displayed_network_usage_map_; 443bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 444bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map that contains the CPU usage (in %) for a process since last refresh. 445bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen CPUUsageMap cpu_usage_map_; 446bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 447bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A map that contains the private/shared memory usage of the process. We 448bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // cache this because the same APIs are called on linux and windows, and 449bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // because the linux call takes >10ms to complete. This cache is cleared on 450bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // every Refresh(). 451bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen mutable MemoryUsageMap memory_usage_map_; 452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ObserverList<TaskManagerModelObserver> observer_list_; 454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // How many calls to StartUpdating have been made without matching calls to 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // StopUpdating. 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int update_requests_; 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 459bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Whether we are currently in the process of updating. 460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen UpdateState update_state_; 461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // A salt lick for the goats. 463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int goat_salt_; 464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen DISALLOW_COPY_AND_ASSIGN(TaskManagerModel); 466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}; 467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif // CHROME_BROWSER_TASK_MANAGER_TASK_MANAGER_H_ 469