OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/task_manager/task_manager.h" | 5 #include "chrome/browser/task_manager/task_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/i18n/number_formatting.h" | 8 #include "base/i18n/number_formatting.h" |
9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/prefs/pref_registry_simple.h" | 11 #include "base/prefs/pref_registry_simple.h" |
12 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
| 13 #include "base/process/process_metrics.h" |
13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
14 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
15 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
16 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
18 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
19 #include "base/thread_task_runner_handle.h" | 20 #include "base/thread_task_runner_handle.h" |
20 #include "chrome/browser/browser_process.h" | 21 #include "chrome/browser/browser_process.h" |
21 #include "chrome/browser/private_working_set_snapshot.h" | |
22 #include "chrome/browser/profiles/profile_manager.h" | 22 #include "chrome/browser/profiles/profile_manager.h" |
23 #include "chrome/browser/profiles/profile_window.h" | 23 #include "chrome/browser/profiles/profile_window.h" |
24 #include "chrome/browser/task_manager/background_information.h" | 24 #include "chrome/browser/task_manager/background_information.h" |
25 #include "chrome/browser/task_manager/browser_process_resource_provider.h" | 25 #include "chrome/browser/task_manager/browser_process_resource_provider.h" |
26 #include "chrome/browser/task_manager/child_process_resource_provider.h" | 26 #include "chrome/browser/task_manager/child_process_resource_provider.h" |
27 #include "chrome/browser/task_manager/extension_information.h" | 27 #include "chrome/browser/task_manager/extension_information.h" |
28 #include "chrome/browser/task_manager/guest_information.h" | 28 #include "chrome/browser/task_manager/guest_information.h" |
29 #include "chrome/browser/task_manager/panel_information.h" | 29 #include "chrome/browser/task_manager/panel_information.h" |
30 #include "chrome/browser/task_manager/printing_information.h" | 30 #include "chrome/browser/task_manager/printing_information.h" |
31 #include "chrome/browser/task_manager/resource_provider.h" | 31 #include "chrome/browser/task_manager/resource_provider.h" |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 AddResourceProvider( | 267 AddResourceProvider( |
268 new task_manager::ChildProcessResourceProvider(task_manager)); | 268 new task_manager::ChildProcessResourceProvider(task_manager)); |
269 AddResourceProvider(new task_manager::WebContentsResourceProvider( | 269 AddResourceProvider(new task_manager::WebContentsResourceProvider( |
270 task_manager, | 270 task_manager, |
271 scoped_ptr<WebContentsInformation>( | 271 scoped_ptr<WebContentsInformation>( |
272 new task_manager::ExtensionInformation()))); | 272 new task_manager::ExtensionInformation()))); |
273 AddResourceProvider(new task_manager::WebContentsResourceProvider( | 273 AddResourceProvider(new task_manager::WebContentsResourceProvider( |
274 task_manager, | 274 task_manager, |
275 scoped_ptr<WebContentsInformation>( | 275 scoped_ptr<WebContentsInformation>( |
276 new task_manager::GuestInformation()))); | 276 new task_manager::GuestInformation()))); |
277 #if defined(OS_WIN) | |
278 working_set_snapshot_.reset(new PrivateWorkingSetSnapshot); | |
279 working_set_snapshot_->AddToMonitorList("chrome"); | |
280 working_set_snapshot_->AddToMonitorList("nacl64"); | |
281 #endif | |
282 } | 277 } |
283 | 278 |
284 void TaskManagerModel::AddObserver(TaskManagerModelObserver* observer) { | 279 void TaskManagerModel::AddObserver(TaskManagerModelObserver* observer) { |
285 observer_list_.AddObserver(observer); | 280 observer_list_.AddObserver(observer); |
286 } | 281 } |
287 | 282 |
288 void TaskManagerModel::RemoveObserver(TaskManagerModelObserver* observer) { | 283 void TaskManagerModel::RemoveObserver(TaskManagerModelObserver* observer) { |
289 observer_list_.RemoveObserver(observer); | 284 observer_list_.RemoveObserver(observer); |
290 } | 285 } |
291 | 286 |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 MetricsMap::const_iterator iter = metrics_map_.find(handle); | 571 MetricsMap::const_iterator iter = metrics_map_.find(handle); |
577 if (iter == metrics_map_.end() || | 572 if (iter == metrics_map_.end() || |
578 !iter->second->GetWorkingSetKBytes(&ws_usage)) | 573 !iter->second->GetWorkingSetKBytes(&ws_usage)) |
579 return false; | 574 return false; |
580 | 575 |
581 values.is_physical_memory_valid = true; | 576 values.is_physical_memory_valid = true; |
582 #if defined(OS_LINUX) | 577 #if defined(OS_LINUX) |
583 // On Linux private memory is also resident. Just use it. | 578 // On Linux private memory is also resident. Just use it. |
584 values.physical_memory = ws_usage.priv * 1024; | 579 values.physical_memory = ws_usage.priv * 1024; |
585 #else | 580 #else |
586 // Memory = working_set.private which is working set minus shareable. This | 581 // Memory = working_set.private + working_set.shareable. |
587 // avoids the unpredictable counting that occurs when calculating memory as | 582 // We exclude the shared memory. |
588 // working set minus shared (renderer code counted when one tab is open and | |
589 // not counted when two or more are open) and it is much more efficient to | |
590 // calculate on Windows. | |
591 values.physical_memory = iter->second->GetWorkingSetSize(); | 583 values.physical_memory = iter->second->GetWorkingSetSize(); |
592 values.physical_memory -= ws_usage.shareable * 1024; | 584 values.physical_memory -= ws_usage.shared * 1024; |
593 #endif | 585 #endif |
594 } | 586 } |
595 *result = values.physical_memory; | 587 *result = values.physical_memory; |
596 return true; | 588 return true; |
597 } | 589 } |
598 | 590 |
599 void TaskManagerModel::GetGDIHandles(int index, | 591 void TaskManagerModel::GetGDIHandles(int index, |
600 size_t* current, | 592 size_t* current, |
601 size_t* peak) const { | 593 size_t* peak) const { |
602 *current = 0; | 594 *current = 0; |
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1124 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_, | 1116 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_, |
1125 OnItemsRemoved(0, size)); | 1117 OnItemsRemoved(0, size)); |
1126 } | 1118 } |
1127 } | 1119 } |
1128 | 1120 |
1129 void TaskManagerModel::ModelChanged() { | 1121 void TaskManagerModel::ModelChanged() { |
1130 // Notify the table that the contents have changed for it to redraw. | 1122 // Notify the table that the contents have changed for it to redraw. |
1131 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_, OnModelChanged()); | 1123 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_, OnModelChanged()); |
1132 } | 1124 } |
1133 | 1125 |
1134 void TaskManagerModel::RefreshPhysicalMemoryFromWorkingSetSnapshot() { | |
1135 #if defined(OS_WIN) | |
1136 // Collect working-set data for all monitored processes in one operation, to | |
1137 // avoid the inefficiency of retrieving it one at a time. | |
1138 working_set_snapshot_->Sample(); | |
1139 | |
1140 for (size_t i = 0; i < resources_.size(); ++i) { | |
1141 size_t private_working_set = | |
1142 working_set_snapshot_->GetPrivateWorkingSet(GetProcessId(i)); | |
1143 | |
1144 // If working-set data is available then use it. If not then | |
1145 // GetWorkingSetKBytes will retrieve the data. This is rare except on | |
1146 // Windows XP where GetWorkingSetKBytes will always be used. | |
1147 if (private_working_set) { | |
1148 // Fill in the cache with the retrieved private working set value. | |
1149 base::ProcessHandle handle = GetResource(i)->GetProcess(); | |
1150 PerProcessValues& values(per_process_cache_[handle]); | |
1151 values.is_physical_memory_valid = true; | |
1152 // Note that the other memory fields are *not* filled in. | |
1153 values.physical_memory = private_working_set; | |
1154 } | |
1155 } | |
1156 #else | |
1157 // This is a NOP on other platforms because they can efficiently retrieve | |
1158 // the private working-set data on a per-process basis. | |
1159 #endif | |
1160 } | |
1161 | |
1162 void TaskManagerModel::Refresh() { | 1126 void TaskManagerModel::Refresh() { |
1163 per_resource_cache_.clear(); | 1127 per_resource_cache_.clear(); |
1164 per_process_cache_.clear(); | 1128 per_process_cache_.clear(); |
1165 RefreshPhysicalMemoryFromWorkingSetSnapshot(); | |
1166 | 1129 |
1167 #if !defined(DISABLE_NACL) | 1130 #if !defined(DISABLE_NACL) |
1168 nacl::NaClBrowser* nacl_browser = nacl::NaClBrowser::GetInstance(); | 1131 nacl::NaClBrowser* nacl_browser = nacl::NaClBrowser::GetInstance(); |
1169 #endif // !defined(DISABLE_NACL) | 1132 #endif // !defined(DISABLE_NACL) |
1170 | 1133 |
1171 // Compute the CPU usage values and check if NaCl GDB debug stub port is | 1134 // Compute the CPU usage values and check if NaCl GDB debug stub port is |
1172 // known. | 1135 // known. |
1173 // Note that we compute the CPU usage for all resources (instead of doing it | 1136 // Note that we compute the CPU usage for all resources (instead of doing it |
1174 // lazily) as process_util::GetCPUUsage() returns the CPU usage since the last | 1137 // lazily) as process_util::GetCPUUsage() returns the CPU usage since the last |
1175 // time it was called, and not calling it everytime would skew the value the | 1138 // time it was called, and not calling it everytime would skew the value the |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1562 params.host_desktop_type = desktop_type; | 1525 params.host_desktop_type = desktop_type; |
1563 chrome::Navigate(¶ms); | 1526 chrome::Navigate(¶ms); |
1564 } | 1527 } |
1565 | 1528 |
1566 TaskManager::TaskManager() | 1529 TaskManager::TaskManager() |
1567 : model_(new TaskManagerModel(this)) { | 1530 : model_(new TaskManagerModel(this)) { |
1568 } | 1531 } |
1569 | 1532 |
1570 TaskManager::~TaskManager() { | 1533 TaskManager::~TaskManager() { |
1571 } | 1534 } |
OLD | NEW |