Chromium Code Reviews| 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_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 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::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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |