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/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/i18n/number_formatting.h" | 9 #include "base/i18n/number_formatting.h" |
10 #include "base/i18n/rtl.h" | 10 #include "base/i18n/rtl.h" |
(...skipping 13 matching lines...) Expand all Loading... | |
24 #include "chrome/browser/task_manager/task_manager_resource_providers.h" | 24 #include "chrome/browser/task_manager/task_manager_resource_providers.h" |
25 #include "chrome/browser/task_manager/task_manager_worker_resource_provider.h" | 25 #include "chrome/browser/task_manager/task_manager_worker_resource_provider.h" |
26 #include "chrome/browser/ui/browser_finder.h" | 26 #include "chrome/browser/ui/browser_finder.h" |
27 #include "chrome/browser/ui/browser_list.h" | 27 #include "chrome/browser/ui/browser_list.h" |
28 #include "chrome/browser/ui/browser_navigator.h" | 28 #include "chrome/browser/ui/browser_navigator.h" |
29 #include "chrome/common/pref_names.h" | 29 #include "chrome/common/pref_names.h" |
30 #include "chrome/common/url_constants.h" | 30 #include "chrome/common/url_constants.h" |
31 #include "chrome/common/view_type.h" | 31 #include "chrome/common/view_type.h" |
32 #include "content/public/browser/browser_child_process_host.h" | 32 #include "content/public/browser/browser_child_process_host.h" |
33 #include "content/public/browser/browser_thread.h" | 33 #include "content/public/browser/browser_thread.h" |
34 #include "content/public/browser/gpu_data_manager.h" | |
35 #include "content/public/browser/gpu_data_manager_observer.h" | |
34 #include "content/public/browser/render_view_host.h" | 36 #include "content/public/browser/render_view_host.h" |
35 #include "content/public/browser/resource_request_info.h" | 37 #include "content/public/browser/resource_request_info.h" |
36 #include "content/public/browser/web_contents.h" | 38 #include "content/public/browser/web_contents.h" |
37 #include "content/public/browser/web_contents_delegate.h" | 39 #include "content/public/browser/web_contents_delegate.h" |
38 #include "content/public/common/result_codes.h" | 40 #include "content/public/common/result_codes.h" |
39 #include "grit/chromium_strings.h" | 41 #include "grit/chromium_strings.h" |
40 #include "grit/generated_resources.h" | 42 #include "grit/generated_resources.h" |
41 #include "grit/ui_resources.h" | 43 #include "grit/ui_resources.h" |
42 #include "ui/base/l10n/l10n_util.h" | 44 #include "ui/base/l10n/l10n_util.h" |
43 #include "ui/base/resource/resource_bundle.h" | 45 #include "ui/base/resource/resource_bundle.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 ui::FormatBytesWithUnits(stat.liveSize, ui::DATA_UNITS_KIBIBYTE, false)); | 78 ui::FormatBytesWithUnits(stat.liveSize, ui::DATA_UNITS_KIBIBYTE, false)); |
77 } | 79 } |
78 | 80 |
79 } // namespace | 81 } // namespace |
80 | 82 |
81 //////////////////////////////////////////////////////////////////////////////// | 83 //////////////////////////////////////////////////////////////////////////////// |
82 // TaskManagerModel class | 84 // TaskManagerModel class |
83 //////////////////////////////////////////////////////////////////////////////// | 85 //////////////////////////////////////////////////////////////////////////////// |
84 | 86 |
85 TaskManagerModel::TaskManagerModel(TaskManager* task_manager) | 87 TaskManagerModel::TaskManagerModel(TaskManager* task_manager) |
86 : update_requests_(0), | 88 : pending_vidmem_usage_stats_update_(false), |
89 update_requests_(0), | |
87 listen_requests_(0), | 90 listen_requests_(0), |
88 update_state_(IDLE), | 91 update_state_(IDLE), |
89 goat_salt_(base::RandUint64()), | 92 goat_salt_(base::RandUint64()), |
90 last_unique_id_(0) { | 93 last_unique_id_(0) { |
91 AddResourceProvider( | 94 AddResourceProvider( |
92 new TaskManagerBrowserProcessResourceProvider(task_manager)); | 95 new TaskManagerBrowserProcessResourceProvider(task_manager)); |
93 AddResourceProvider( | 96 AddResourceProvider( |
94 new TaskManagerBackgroundContentsResourceProvider(task_manager)); | 97 new TaskManagerBackgroundContentsResourceProvider(task_manager)); |
95 AddResourceProvider(new TaskManagerTabContentsResourceProvider(task_manager)); | 98 AddResourceProvider(new TaskManagerTabContentsResourceProvider(task_manager)); |
96 AddResourceProvider(new TaskManagerPanelResourceProvider(task_manager)); | 99 AddResourceProvider(new TaskManagerPanelResourceProvider(task_manager)); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
248 string16 TaskManagerModel::GetResourceWebCoreCSSCacheSize( | 251 string16 TaskManagerModel::GetResourceWebCoreCSSCacheSize( |
249 int index) const { | 252 int index) const { |
250 CHECK_LT(index, ResourceCount()); | 253 CHECK_LT(index, ResourceCount()); |
251 if (!resources_[index]->ReportsCacheStats()) | 254 if (!resources_[index]->ReportsCacheStats()) |
252 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT); | 255 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT); |
253 const WebKit::WebCache::ResourceTypeStats stats( | 256 const WebKit::WebCache::ResourceTypeStats stats( |
254 resources_[index]->GetWebCoreCacheStats()); | 257 resources_[index]->GetWebCoreCacheStats()); |
255 return FormatStatsSize(stats.cssStyleSheets); | 258 return FormatStatsSize(stats.cssStyleSheets); |
256 } | 259 } |
257 | 260 |
261 string16 TaskManagerModel::GetResourceVidmem( | |
262 int index) const { | |
brettw
2012/08/17 19:07:24
Doesn't this fit on the previous line?
ccameron
2012/08/17 20:52:55
Done.
| |
263 CHECK_LT(index, ResourceCount()); | |
264 | |
265 bool result; | |
266 size_t vidmem; | |
267 bool has_duplicates; | |
268 result = GetVidmem(index, &vidmem, &has_duplicates); | |
269 | |
270 if (!result || !vidmem) { | |
271 return ASCIIToUTF16("N/A"); | |
brettw
2012/08/17 19:07:24
It's not clear why you're using ASCII in this plac
ccameron
2012/08/17 20:52:55
The other instances of N/A use ASCII -- I changed
| |
272 } else if (has_duplicates) { | |
273 return UTF8ToUTF16("(") + | |
274 GetMemCellText(vidmem) + | |
275 UTF8ToUTF16(")"); | |
276 } else { | |
277 return GetMemCellText(vidmem); | |
278 } | |
279 } | |
280 | |
258 string16 TaskManagerModel::GetResourceFPS( | 281 string16 TaskManagerModel::GetResourceFPS( |
259 int index) const { | 282 int index) const { |
260 CHECK_LT(index, ResourceCount()); | 283 CHECK_LT(index, ResourceCount()); |
261 if (!resources_[index]->ReportsFPS()) | 284 if (!resources_[index]->ReportsFPS()) |
262 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT); | 285 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT); |
263 double fps = resources_[index]->GetFPS(); | 286 double fps = resources_[index]->GetFPS(); |
264 return UTF8ToUTF16(base::StringPrintf("%.0f", fps)); | 287 return UTF8ToUTF16(base::StringPrintf("%.0f", fps)); |
265 } | 288 } |
266 | 289 |
267 string16 TaskManagerModel::GetResourceSqliteMemoryUsed(int index) const { | 290 string16 TaskManagerModel::GetResourceSqliteMemoryUsed(int index) const { |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
441 if (IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN == col_id) | 464 if (IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN == col_id) |
442 return ValueCompare<size_t>(stats1.images.size, stats2.images.size); | 465 return ValueCompare<size_t>(stats1.images.size, stats2.images.size); |
443 if (IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN == col_id) | 466 if (IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN == col_id) |
444 return ValueCompare<size_t>(stats1.scripts.size, stats2.scripts.size); | 467 return ValueCompare<size_t>(stats1.scripts.size, stats2.scripts.size); |
445 DCHECK_EQ(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, col_id); | 468 DCHECK_EQ(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, col_id); |
446 return ValueCompare<size_t>(stats1.cssStyleSheets.size, | 469 return ValueCompare<size_t>(stats1.cssStyleSheets.size, |
447 stats2.cssStyleSheets.size); | 470 stats2.cssStyleSheets.size); |
448 } else if (col_id == IDS_TASK_MANAGER_FPS_COLUMN) { | 471 } else if (col_id == IDS_TASK_MANAGER_FPS_COLUMN) { |
449 return ValueCompare<float>(resources_[row1]->GetFPS(), | 472 return ValueCompare<float>(resources_[row1]->GetFPS(), |
450 resources_[row2]->GetFPS()); | 473 resources_[row2]->GetFPS()); |
474 } else if (col_id == IDS_TASK_MANAGER_VIDMEM_COLUMN) { | |
475 size_t value1; | |
476 size_t value2; | |
477 bool has_duplicates; | |
478 if (!GetVidmem(row1, &value1, &has_duplicates)) value1 = 0; | |
479 if (!GetVidmem(row2, &value2, &has_duplicates)) value2 = 0; | |
480 return ValueCompare<size_t>(value1, value2); | |
451 } else if (col_id == IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN) { | 481 } else if (col_id == IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN) { |
452 return ValueCompare<int>(GetGoatsTeleported(row1), | 482 return ValueCompare<int>(GetGoatsTeleported(row1), |
453 GetGoatsTeleported(row2)); | 483 GetGoatsTeleported(row2)); |
454 } else if (col_id == IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN) { | 484 } else if (col_id == IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN) { |
455 size_t value1; | 485 size_t value1; |
456 size_t value2; | 486 size_t value2; |
457 bool reports_v8_memory1 = GetV8Memory(row1, &value1); | 487 bool reports_v8_memory1 = GetV8Memory(row1, &value1); |
458 bool reports_v8_memory2 = GetV8Memory(row2, &value2); | 488 bool reports_v8_memory2 = GetV8Memory(row2, &value2); |
459 if (reports_v8_memory1 == reports_v8_memory2) | 489 if (reports_v8_memory1 == reports_v8_memory2) |
460 return ValueCompare<size_t>(value1, value2); | 490 return ValueCompare<size_t>(value1, value2); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
560 | 590 |
561 bool TaskManagerModel::GetWebCoreCacheStats( | 591 bool TaskManagerModel::GetWebCoreCacheStats( |
562 int index, WebKit::WebCache::ResourceTypeStats* result) const { | 592 int index, WebKit::WebCache::ResourceTypeStats* result) const { |
563 if (!resources_[index]->ReportsCacheStats()) | 593 if (!resources_[index]->ReportsCacheStats()) |
564 return false; | 594 return false; |
565 | 595 |
566 *result = resources_[index]->GetWebCoreCacheStats(); | 596 *result = resources_[index]->GetWebCoreCacheStats(); |
567 return true; | 597 return true; |
568 } | 598 } |
569 | 599 |
600 bool TaskManagerModel::GetVidmem( | |
601 int index, size_t* vidmem, bool* has_duplicates) const { | |
602 TaskManager::Resource* resource = resources_[index]; | |
603 base::ProcessId pid = base::GetProcId(resource->GetProcess()); | |
604 content::GPUVidmemUsageStats::ProcessMap::const_iterator i = | |
605 vidmem_usage_stats_.process_map.find(pid); | |
606 if (i == vidmem_usage_stats_.process_map.end()) { | |
607 *vidmem = 0; | |
608 *has_duplicates = false; | |
609 return false; | |
610 } | |
611 *vidmem = (*i).second.vidmem; | |
612 *has_duplicates = (*i).second.has_duplicates; | |
613 return true; | |
614 } | |
615 | |
570 bool TaskManagerModel::GetFPS(int index, float* result) const { | 616 bool TaskManagerModel::GetFPS(int index, float* result) const { |
571 *result = 0; | 617 *result = 0; |
572 if (!resources_[index]->ReportsFPS()) | 618 if (!resources_[index]->ReportsFPS()) |
573 return false; | 619 return false; |
574 | 620 |
575 *result = resources_[index]->GetFPS(); | 621 *result = resources_[index]->GetFPS(); |
576 return true; | 622 return true; |
577 } | 623 } |
578 | 624 |
579 bool TaskManagerModel::GetSqliteMemoryUsedBytes( | 625 bool TaskManagerModel::GetSqliteMemoryUsedBytes( |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
878 float fps) { | 924 float fps) { |
879 for (ResourceList::iterator it = resources_.begin(); | 925 for (ResourceList::iterator it = resources_.begin(); |
880 it != resources_.end(); ++it) { | 926 it != resources_.end(); ++it) { |
881 if (base::GetProcId((*it)->GetProcess()) == renderer_id && | 927 if (base::GetProcId((*it)->GetProcess()) == renderer_id && |
882 (*it)->GetRoutingID() == routing_id) { | 928 (*it)->GetRoutingID() == routing_id) { |
883 (*it)->NotifyFPS(fps); | 929 (*it)->NotifyFPS(fps); |
884 } | 930 } |
885 } | 931 } |
886 } | 932 } |
887 | 933 |
934 void TaskManagerModel::NotifyVidmemUsageStats( | |
935 const content::GPUVidmemUsageStats& vidmem_usage_stats) { | |
936 DCHECK(pending_vidmem_usage_stats_update_); | |
937 vidmem_usage_stats_ = vidmem_usage_stats; | |
938 pending_vidmem_usage_stats_update_ = false; | |
939 } | |
940 | |
888 void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id, | 941 void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id, |
889 size_t v8_memory_allocated, | 942 size_t v8_memory_allocated, |
890 size_t v8_memory_used) { | 943 size_t v8_memory_used) { |
891 for (ResourceList::iterator it = resources_.begin(); | 944 for (ResourceList::iterator it = resources_.begin(); |
892 it != resources_.end(); ++it) { | 945 it != resources_.end(); ++it) { |
893 if (base::GetProcId((*it)->GetProcess()) == renderer_id) { | 946 if (base::GetProcId((*it)->GetProcess()) == renderer_id) { |
894 (*it)->NotifyV8HeapStats(v8_memory_allocated, v8_memory_used); | 947 (*it)->NotifyV8HeapStats(v8_memory_allocated, v8_memory_used); |
895 } | 948 } |
896 } | 949 } |
897 } | 950 } |
898 | 951 |
952 class TaskManagerModelGpuDataManagerObserver | |
953 : public content::GpuDataManagerObserver { | |
954 public: | |
955 | |
956 TaskManagerModelGpuDataManagerObserver() { | |
957 content::GpuDataManager::GetInstance()->AddObserver(this); | |
958 } | |
959 | |
960 virtual ~TaskManagerModelGpuDataManagerObserver() { | |
961 content::GpuDataManager::GetInstance()->RemoveObserver(this); | |
962 } | |
963 | |
964 static void NotifyVidmemUsageStats( | |
965 content::GPUVidmemUsageStats vidmem_usage_stats) { | |
966 TaskManager::GetInstance()->model()->NotifyVidmemUsageStats( | |
967 vidmem_usage_stats); | |
968 } | |
969 | |
970 virtual void OnGpuInfoUpdate() OVERRIDE {} | |
971 | |
972 virtual void OnVidmemUsageStatsUpdate( | |
973 const content::GPUVidmemUsageStats& vidmem_usage_stats) OVERRIDE { | |
974 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { | |
975 NotifyVidmemUsageStats(vidmem_usage_stats); | |
976 } else { | |
977 BrowserThread::PostTask( | |
978 BrowserThread::UI, FROM_HERE, base::Bind( | |
979 &TaskManagerModelGpuDataManagerObserver::NotifyVidmemUsageStats, | |
980 vidmem_usage_stats)); | |
981 } | |
982 delete this; | |
983 } | |
984 }; | |
985 | |
986 void TaskManagerModel::RefreshVidmemUsageStats() | |
987 { | |
988 if (pending_vidmem_usage_stats_update_) return; | |
989 pending_vidmem_usage_stats_update_ = true; | |
990 new TaskManagerModelGpuDataManagerObserver; | |
991 content::GpuDataManager::GetInstance()->RequestVidmemUsageStatsUpdate(); | |
992 } | |
993 | |
899 void TaskManagerModel::Refresh() { | 994 void TaskManagerModel::Refresh() { |
900 DCHECK_NE(IDLE, update_state_); | 995 DCHECK_NE(IDLE, update_state_); |
901 | 996 |
902 if (update_state_ == STOPPING) { | 997 if (update_state_ == STOPPING) { |
903 // We have been asked to stop. | 998 // We have been asked to stop. |
904 update_state_ = IDLE; | 999 update_state_ = IDLE; |
905 return; | 1000 return; |
906 } | 1001 } |
907 | 1002 |
908 goat_salt_ = base::RandUint64(); | 1003 goat_salt_ = base::RandUint64(); |
(...skipping 12 matching lines...) Expand all Loading... | |
921 continue; // Already computed. | 1016 continue; // Already computed. |
922 | 1017 |
923 MetricsMap::iterator metrics_iter = metrics_map_.find(process); | 1018 MetricsMap::iterator metrics_iter = metrics_map_.find(process); |
924 DCHECK(metrics_iter != metrics_map_.end()); | 1019 DCHECK(metrics_iter != metrics_map_.end()); |
925 cpu_usage_map_[process] = metrics_iter->second->GetCPUUsage(); | 1020 cpu_usage_map_[process] = metrics_iter->second->GetCPUUsage(); |
926 } | 1021 } |
927 | 1022 |
928 // Clear the memory values so they can be querried lazily. | 1023 // Clear the memory values so they can be querried lazily. |
929 memory_usage_map_.clear(); | 1024 memory_usage_map_.clear(); |
930 | 1025 |
1026 // Send a request to refresh GPU memory consumption values | |
1027 RefreshVidmemUsageStats(); | |
1028 | |
931 // Compute the new network usage values. | 1029 // Compute the new network usage values. |
932 displayed_network_usage_map_.clear(); | 1030 displayed_network_usage_map_.clear(); |
933 base::TimeDelta update_time = | 1031 base::TimeDelta update_time = |
934 base::TimeDelta::FromMilliseconds(kUpdateTimeMs); | 1032 base::TimeDelta::FromMilliseconds(kUpdateTimeMs); |
935 for (ResourceValueMap::iterator iter = current_byte_count_map_.begin(); | 1033 for (ResourceValueMap::iterator iter = current_byte_count_map_.begin(); |
936 iter != current_byte_count_map_.end(); ++iter) { | 1034 iter != current_byte_count_map_.end(); ++iter) { |
937 if (update_time > base::TimeDelta::FromSeconds(1)) { | 1035 if (update_time > base::TimeDelta::FromSeconds(1)) { |
938 int divider = update_time.InSeconds(); | 1036 int divider = update_time.InSeconds(); |
939 displayed_network_usage_map_[iter->first] = iter->second / divider; | 1037 displayed_network_usage_map_[iter->first] = iter->second / divider; |
940 } else { | 1038 } else { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1225 // Count the number of extensions with background pages (including | 1323 // Count the number of extensions with background pages (including |
1226 // incognito). | 1324 // incognito). |
1227 count += CountExtensionBackgroundPagesForProfile(profile); | 1325 count += CountExtensionBackgroundPagesForProfile(profile); |
1228 if (profile->HasOffTheRecordProfile()) { | 1326 if (profile->HasOffTheRecordProfile()) { |
1229 count += CountExtensionBackgroundPagesForProfile( | 1327 count += CountExtensionBackgroundPagesForProfile( |
1230 profile->GetOffTheRecordProfile()); | 1328 profile->GetOffTheRecordProfile()); |
1231 } | 1329 } |
1232 } | 1330 } |
1233 return count; | 1331 return count; |
1234 } | 1332 } |
OLD | NEW |