Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: chrome/browser/task_manager/task_manager.cc

Issue 10854076: Add GPU memory tab to the task manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Incorporate taskman feedback Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698