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

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 review 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
« no previous file with comments | « chrome/browser/task_manager/task_manager.h ('k') | chrome/browser/ui/cocoa/task_manager_mac.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_video_memory_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::GetResourceVideoMemory(int index) const {
262 CHECK_LT(index, ResourceCount());
263
264 bool result;
265 size_t video_memory;
266 bool has_duplicates;
267 result = GetVideoMemory(index, &video_memory, &has_duplicates);
268
269 if (!result || !video_memory) {
270 return ASCIIToUTF16("N/A");
271 } else if (has_duplicates) {
272 return ASCIIToUTF16("(") +
273 GetMemCellText(video_memory) +
274 ASCIIToUTF16(")");
275 } else {
276 return GetMemCellText(video_memory);
277 }
278 }
279
258 string16 TaskManagerModel::GetResourceFPS( 280 string16 TaskManagerModel::GetResourceFPS(
259 int index) const { 281 int index) const {
260 CHECK_LT(index, ResourceCount()); 282 CHECK_LT(index, ResourceCount());
261 if (!resources_[index]->ReportsFPS()) 283 if (!resources_[index]->ReportsFPS())
262 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT); 284 return l10n_util::GetStringUTF16(IDS_TASK_MANAGER_NA_CELL_TEXT);
263 double fps = resources_[index]->GetFPS(); 285 double fps = resources_[index]->GetFPS();
264 return UTF8ToUTF16(base::StringPrintf("%.0f", fps)); 286 return UTF8ToUTF16(base::StringPrintf("%.0f", fps));
265 } 287 }
266 288
267 string16 TaskManagerModel::GetResourceSqliteMemoryUsed(int index) const { 289 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) 463 if (IDS_TASK_MANAGER_WEBCORE_IMAGE_CACHE_COLUMN == col_id)
442 return ValueCompare<size_t>(stats1.images.size, stats2.images.size); 464 return ValueCompare<size_t>(stats1.images.size, stats2.images.size);
443 if (IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN == col_id) 465 if (IDS_TASK_MANAGER_WEBCORE_SCRIPTS_CACHE_COLUMN == col_id)
444 return ValueCompare<size_t>(stats1.scripts.size, stats2.scripts.size); 466 return ValueCompare<size_t>(stats1.scripts.size, stats2.scripts.size);
445 DCHECK_EQ(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, col_id); 467 DCHECK_EQ(IDS_TASK_MANAGER_WEBCORE_CSS_CACHE_COLUMN, col_id);
446 return ValueCompare<size_t>(stats1.cssStyleSheets.size, 468 return ValueCompare<size_t>(stats1.cssStyleSheets.size,
447 stats2.cssStyleSheets.size); 469 stats2.cssStyleSheets.size);
448 } else if (col_id == IDS_TASK_MANAGER_FPS_COLUMN) { 470 } else if (col_id == IDS_TASK_MANAGER_FPS_COLUMN) {
449 return ValueCompare<float>(resources_[row1]->GetFPS(), 471 return ValueCompare<float>(resources_[row1]->GetFPS(),
450 resources_[row2]->GetFPS()); 472 resources_[row2]->GetFPS());
473 } else if (col_id == IDS_TASK_MANAGER_VIDEO_MEMORY_COLUMN) {
474 size_t value1;
475 size_t value2;
476 bool has_duplicates;
477 if (!GetVideoMemory(row1, &value1, &has_duplicates)) value1 = 0;
478 if (!GetVideoMemory(row2, &value2, &has_duplicates)) value2 = 0;
479 return ValueCompare<size_t>(value1, value2);
451 } else if (col_id == IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN) { 480 } else if (col_id == IDS_TASK_MANAGER_GOATS_TELEPORTED_COLUMN) {
452 return ValueCompare<int>(GetGoatsTeleported(row1), 481 return ValueCompare<int>(GetGoatsTeleported(row1),
453 GetGoatsTeleported(row2)); 482 GetGoatsTeleported(row2));
454 } else if (col_id == IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN) { 483 } else if (col_id == IDS_TASK_MANAGER_JAVASCRIPT_MEMORY_ALLOCATED_COLUMN) {
455 size_t value1; 484 size_t value1;
456 size_t value2; 485 size_t value2;
457 bool reports_v8_memory1 = GetV8Memory(row1, &value1); 486 bool reports_v8_memory1 = GetV8Memory(row1, &value1);
458 bool reports_v8_memory2 = GetV8Memory(row2, &value2); 487 bool reports_v8_memory2 = GetV8Memory(row2, &value2);
459 if (reports_v8_memory1 == reports_v8_memory2) 488 if (reports_v8_memory1 == reports_v8_memory2)
460 return ValueCompare<size_t>(value1, value2); 489 return ValueCompare<size_t>(value1, value2);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 589
561 bool TaskManagerModel::GetWebCoreCacheStats( 590 bool TaskManagerModel::GetWebCoreCacheStats(
562 int index, WebKit::WebCache::ResourceTypeStats* result) const { 591 int index, WebKit::WebCache::ResourceTypeStats* result) const {
563 if (!resources_[index]->ReportsCacheStats()) 592 if (!resources_[index]->ReportsCacheStats())
564 return false; 593 return false;
565 594
566 *result = resources_[index]->GetWebCoreCacheStats(); 595 *result = resources_[index]->GetWebCoreCacheStats();
567 return true; 596 return true;
568 } 597 }
569 598
599 bool TaskManagerModel::GetVideoMemory(
600 int index, size_t* video_memory, bool* has_duplicates) const {
601 TaskManager::Resource* resource = resources_[index];
602 base::ProcessId pid = base::GetProcId(resource->GetProcess());
603 content::GPUVideoMemoryUsageStats::ProcessMap::const_iterator i =
604 video_memory_usage_stats_.process_map.find(pid);
605 if (i == video_memory_usage_stats_.process_map.end()) {
606 *video_memory = 0;
607 *has_duplicates = false;
608 return false;
609 }
610 *video_memory = (*i).second.video_memory;
611 *has_duplicates = (*i).second.has_duplicates;
612 return true;
613 }
614
570 bool TaskManagerModel::GetFPS(int index, float* result) const { 615 bool TaskManagerModel::GetFPS(int index, float* result) const {
571 *result = 0; 616 *result = 0;
572 if (!resources_[index]->ReportsFPS()) 617 if (!resources_[index]->ReportsFPS())
573 return false; 618 return false;
574 619
575 *result = resources_[index]->GetFPS(); 620 *result = resources_[index]->GetFPS();
576 return true; 621 return true;
577 } 622 }
578 623
579 bool TaskManagerModel::GetSqliteMemoryUsedBytes( 624 bool TaskManagerModel::GetSqliteMemoryUsedBytes(
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
878 float fps) { 923 float fps) {
879 for (ResourceList::iterator it = resources_.begin(); 924 for (ResourceList::iterator it = resources_.begin();
880 it != resources_.end(); ++it) { 925 it != resources_.end(); ++it) {
881 if (base::GetProcId((*it)->GetProcess()) == renderer_id && 926 if (base::GetProcId((*it)->GetProcess()) == renderer_id &&
882 (*it)->GetRoutingID() == routing_id) { 927 (*it)->GetRoutingID() == routing_id) {
883 (*it)->NotifyFPS(fps); 928 (*it)->NotifyFPS(fps);
884 } 929 }
885 } 930 }
886 } 931 }
887 932
933 void TaskManagerModel::NotifyVideoMemoryUsageStats(
934 const content::GPUVideoMemoryUsageStats& video_memory_usage_stats) {
935 DCHECK(pending_video_memory_usage_stats_update_);
936 video_memory_usage_stats_ = video_memory_usage_stats;
937 pending_video_memory_usage_stats_update_ = false;
938 }
939
888 void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id, 940 void TaskManagerModel::NotifyV8HeapStats(base::ProcessId renderer_id,
889 size_t v8_memory_allocated, 941 size_t v8_memory_allocated,
890 size_t v8_memory_used) { 942 size_t v8_memory_used) {
891 for (ResourceList::iterator it = resources_.begin(); 943 for (ResourceList::iterator it = resources_.begin();
892 it != resources_.end(); ++it) { 944 it != resources_.end(); ++it) {
893 if (base::GetProcId((*it)->GetProcess()) == renderer_id) { 945 if (base::GetProcId((*it)->GetProcess()) == renderer_id) {
894 (*it)->NotifyV8HeapStats(v8_memory_allocated, v8_memory_used); 946 (*it)->NotifyV8HeapStats(v8_memory_allocated, v8_memory_used);
895 } 947 }
896 } 948 }
897 } 949 }
898 950
951 class TaskManagerModelGpuDataManagerObserver
952 : public content::GpuDataManagerObserver {
953 public:
954
955 TaskManagerModelGpuDataManagerObserver() {
956 content::GpuDataManager::GetInstance()->AddObserver(this);
957 }
958
959 virtual ~TaskManagerModelGpuDataManagerObserver() {
960 content::GpuDataManager::GetInstance()->RemoveObserver(this);
961 }
962
963 static void NotifyVideoMemoryUsageStats(
964 content::GPUVideoMemoryUsageStats video_memory_usage_stats) {
965 TaskManager::GetInstance()->model()->NotifyVideoMemoryUsageStats(
966 video_memory_usage_stats);
967 }
968
969 virtual void OnGpuInfoUpdate() OVERRIDE {}
970
971 virtual void OnVideoMemoryUsageStatsUpdate(
972 const content::GPUVideoMemoryUsageStats& video_memory_usage_stats)
973 OVERRIDE {
974 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
975 NotifyVideoMemoryUsageStats(video_memory_usage_stats);
976 } else {
977 BrowserThread::PostTask(
978 BrowserThread::UI, FROM_HERE, base::Bind(
979 &TaskManagerModelGpuDataManagerObserver::
980 NotifyVideoMemoryUsageStats,
981 video_memory_usage_stats));
982 }
983 delete this;
984 }
985 };
986
987 void TaskManagerModel::RefreshVideoMemoryUsageStats()
988 {
989 if (pending_video_memory_usage_stats_update_) return;
990 pending_video_memory_usage_stats_update_ = true;
991 new TaskManagerModelGpuDataManagerObserver;
Lei Zhang 2012/08/23 02:34:17 Umm, whose job is it to delete this guy?
ccameron 2012/08/23 04:52:35 It deletes itself when the response from the GPU p
992 content::GpuDataManager::GetInstance()->RequestVideoMemoryUsageStatsUpdate();
993 }
994
899 void TaskManagerModel::Refresh() { 995 void TaskManagerModel::Refresh() {
900 DCHECK_NE(IDLE, update_state_); 996 DCHECK_NE(IDLE, update_state_);
901 997
902 if (update_state_ == STOPPING) { 998 if (update_state_ == STOPPING) {
903 // We have been asked to stop. 999 // We have been asked to stop.
904 update_state_ = IDLE; 1000 update_state_ = IDLE;
905 return; 1001 return;
906 } 1002 }
907 1003
908 goat_salt_ = base::RandUint64(); 1004 goat_salt_ = base::RandUint64();
(...skipping 12 matching lines...) Expand all
921 continue; // Already computed. 1017 continue; // Already computed.
922 1018
923 MetricsMap::iterator metrics_iter = metrics_map_.find(process); 1019 MetricsMap::iterator metrics_iter = metrics_map_.find(process);
924 DCHECK(metrics_iter != metrics_map_.end()); 1020 DCHECK(metrics_iter != metrics_map_.end());
925 cpu_usage_map_[process] = metrics_iter->second->GetCPUUsage(); 1021 cpu_usage_map_[process] = metrics_iter->second->GetCPUUsage();
926 } 1022 }
927 1023
928 // Clear the memory values so they can be querried lazily. 1024 // Clear the memory values so they can be querried lazily.
929 memory_usage_map_.clear(); 1025 memory_usage_map_.clear();
930 1026
1027 // Send a request to refresh GPU memory consumption values
1028 RefreshVideoMemoryUsageStats();
1029
931 // Compute the new network usage values. 1030 // Compute the new network usage values.
932 displayed_network_usage_map_.clear(); 1031 displayed_network_usage_map_.clear();
933 base::TimeDelta update_time = 1032 base::TimeDelta update_time =
934 base::TimeDelta::FromMilliseconds(kUpdateTimeMs); 1033 base::TimeDelta::FromMilliseconds(kUpdateTimeMs);
935 for (ResourceValueMap::iterator iter = current_byte_count_map_.begin(); 1034 for (ResourceValueMap::iterator iter = current_byte_count_map_.begin();
936 iter != current_byte_count_map_.end(); ++iter) { 1035 iter != current_byte_count_map_.end(); ++iter) {
937 if (update_time > base::TimeDelta::FromSeconds(1)) { 1036 if (update_time > base::TimeDelta::FromSeconds(1)) {
938 int divider = update_time.InSeconds(); 1037 int divider = update_time.InSeconds();
939 displayed_network_usage_map_[iter->first] = iter->second / divider; 1038 displayed_network_usage_map_[iter->first] = iter->second / divider;
940 } else { 1039 } else {
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 // Count the number of extensions with background pages (including 1324 // Count the number of extensions with background pages (including
1226 // incognito). 1325 // incognito).
1227 count += CountExtensionBackgroundPagesForProfile(profile); 1326 count += CountExtensionBackgroundPagesForProfile(profile);
1228 if (profile->HasOffTheRecordProfile()) { 1327 if (profile->HasOffTheRecordProfile()) {
1229 count += CountExtensionBackgroundPagesForProfile( 1328 count += CountExtensionBackgroundPagesForProfile(
1230 profile->GetOffTheRecordProfile()); 1329 profile->GetOffTheRecordProfile());
1231 } 1330 }
1232 } 1331 }
1233 return count; 1332 return count;
1234 } 1333 }
OLDNEW
« no previous file with comments | « chrome/browser/task_manager/task_manager.h ('k') | chrome/browser/ui/cocoa/task_manager_mac.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698