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

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

Issue 10175008: Improving the process model extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Syncing to the latest tree after a week away. Created 8 years, 7 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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 } 77 }
78 78
79 } // namespace 79 } // namespace
80 80
81 //////////////////////////////////////////////////////////////////////////////// 81 ////////////////////////////////////////////////////////////////////////////////
82 // TaskManagerModel class 82 // TaskManagerModel class
83 //////////////////////////////////////////////////////////////////////////////// 83 ////////////////////////////////////////////////////////////////////////////////
84 84
85 TaskManagerModel::TaskManagerModel(TaskManager* task_manager) 85 TaskManagerModel::TaskManagerModel(TaskManager* task_manager)
86 : update_requests_(0), 86 : update_requests_(0),
87 listen_requests_(0),
87 update_state_(IDLE), 88 update_state_(IDLE),
88 goat_salt_(base::RandUint64()), 89 goat_salt_(base::RandUint64()),
89 last_unique_id_(0) { 90 last_unique_id_(0) {
90 AddResourceProvider( 91 AddResourceProvider(
91 new TaskManagerBrowserProcessResourceProvider(task_manager)); 92 new TaskManagerBrowserProcessResourceProvider(task_manager));
92 AddResourceProvider( 93 AddResourceProvider(
93 new TaskManagerBackgroundContentsResourceProvider(task_manager)); 94 new TaskManagerBackgroundContentsResourceProvider(task_manager));
94 AddResourceProvider(new TaskManagerTabContentsResourceProvider(task_manager)); 95 AddResourceProvider(new TaskManagerTabContentsResourceProvider(task_manager));
95 AddResourceProvider( 96 AddResourceProvider(
96 new TaskManagerChildProcessResourceProvider(task_manager)); 97 new TaskManagerChildProcessResourceProvider(task_manager));
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 size_t phys_mem; 203 size_t phys_mem;
203 GetPhysicalMemory(index, &phys_mem); 204 GetPhysicalMemory(index, &phys_mem);
204 return GetMemCellText(phys_mem); 205 return GetMemCellText(phys_mem);
205 } 206 }
206 207
207 int TaskManagerModel::GetProcessId(int index) const { 208 int TaskManagerModel::GetProcessId(int index) const {
208 CHECK_LT(index, ResourceCount()); 209 CHECK_LT(index, ResourceCount());
209 return base::GetProcId(resources_[index]->GetProcess()); 210 return base::GetProcId(resources_[index]->GetProcess());
210 } 211 }
211 212
213 base::ProcessHandle TaskManagerModel::GetProcess(int index) const {
214 CHECK_LT(index, ResourceCount());
215 return resources_[index]->GetProcess();
216 }
217
212 string16 TaskManagerModel::GetResourceProcessId(int index) const { 218 string16 TaskManagerModel::GetResourceProcessId(int index) const {
213 return base::IntToString16(GetProcessId(index)); 219 return base::IntToString16(GetProcessId(index));
214 } 220 }
215 221
216 string16 TaskManagerModel::GetResourceGoatsTeleported(int index) const { 222 string16 TaskManagerModel::GetResourceGoatsTeleported(int index) const {
217 CHECK_LT(index, ResourceCount()); 223 CHECK_LT(index, ResourceCount());
218 return base::FormatNumber(GetGoatsTeleported(index)); 224 return base::FormatNumber(GetGoatsTeleported(index));
219 } 225 }
220 226
221 string16 TaskManagerModel::GetResourceWebCoreImageCacheSize( 227 string16 TaskManagerModel::GetResourceWebCoreImageCacheSize(
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 586
581 bool TaskManagerModel::GetV8Memory(int index, size_t* result) const { 587 bool TaskManagerModel::GetV8Memory(int index, size_t* result) const {
582 *result = 0; 588 *result = 0;
583 if (!resources_[index]->ReportsV8MemoryStats()) 589 if (!resources_[index]->ReportsV8MemoryStats())
584 return false; 590 return false;
585 591
586 *result = resources_[index]->GetV8MemoryAllocated(); 592 *result = resources_[index]->GetV8MemoryAllocated();
587 return true; 593 return true;
588 } 594 }
589 595
596 bool TaskManagerModel::GetV8MemoryUsed(int index, size_t* result) const {
597 *result = 0;
598 if (!resources_[index]->ReportsV8MemoryStats())
599 return false;
600
601 *result = resources_[index]->GetV8MemoryUsed();
602 return true;
603 }
604
590 bool TaskManagerModel::CanActivate(int index) const { 605 bool TaskManagerModel::CanActivate(int index) const {
591 CHECK_LT(index, ResourceCount()); 606 CHECK_LT(index, ResourceCount());
592 return GetResourceTabContents(index) != NULL; 607 return GetResourceTabContents(index) != NULL;
593 } 608 }
594 609
595 bool TaskManagerModel::CanInspect(int index) const { 610 bool TaskManagerModel::CanInspect(int index) const {
596 CHECK_LT(index, ResourceCount()); 611 CHECK_LT(index, ResourceCount());
597 return resources_[index]->CanInspect(); 612 return resources_[index]->CanInspect();
598 } 613 }
599 614
(...skipping 14 matching lines...) Expand all
614 // Adjust number string if necessary. 629 // Adjust number string if necessary.
615 base::i18n::AdjustStringForLocaleDirection(&str); 630 base::i18n::AdjustStringForLocaleDirection(&str);
616 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_MEM_CELL_TEXT, str); 631 return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_MEM_CELL_TEXT, str);
617 #else 632 #else
618 // System expectation is to show "100 kB", "200 MB", etc. 633 // System expectation is to show "100 kB", "200 MB", etc.
619 // TODO(thakis): Switch to metric units (as opposed to powers of two). 634 // TODO(thakis): Switch to metric units (as opposed to powers of two).
620 return ui::FormatBytes(number); 635 return ui::FormatBytes(number);
621 #endif 636 #endif
622 } 637 }
623 638
639 void TaskManagerModel::StartListening() {
640 // Multiple StartListening requests may come in and we only need to take
641 // action the first time.
642 listen_requests_++;
643 if (listen_requests_ > 1)
644 return;
645 DCHECK_EQ(1, listen_requests_);
646
647 // Notify resource providers that we should start listening to events.
648 for (ResourceProviderList::iterator iter = providers_.begin();
649 iter != providers_.end(); ++iter) {
650 (*iter)->StartUpdating();
651 }
652 }
653
654 void TaskManagerModel::StopListening() {
655 // Don't actually stop listening until we have heard as many calls as those
656 // to StartListening.
657 listen_requests_--;
658 if (listen_requests_ > 0)
659 return;
660
661 DCHECK_EQ(0, listen_requests_);
662
663 // Notify resource providers that we are done listening.
664 for (ResourceProviderList::const_iterator iter = providers_.begin();
665 iter != providers_.end(); ++iter) {
666 (*iter)->StopUpdating();
667 }
668
669 // Must clear the resources before the next attempt to start listening.
670 Clear();
671 }
672
624 void TaskManagerModel::StartUpdating() { 673 void TaskManagerModel::StartUpdating() {
625 // Multiple StartUpdating requests may come in, and we only need to take 674 // Multiple StartUpdating requests may come in, and we only need to take
626 // action the first time. 675 // action the first time.
627 update_requests_++; 676 update_requests_++;
628 if (update_requests_ > 1) 677 if (update_requests_ > 1)
629 return; 678 return;
630 DCHECK_EQ(1, update_requests_); 679 DCHECK_EQ(1, update_requests_);
631 DCHECK_NE(TASK_PENDING, update_state_); 680 DCHECK_NE(TASK_PENDING, update_state_);
632 681
633 // If update_state_ is STOPPING, it means a task is still pending. Setting 682 // If update_state_ is STOPPING, it means a task is still pending. Setting
634 // it to TASK_PENDING ensures the tasks keep being posted (by Refresh()). 683 // it to TASK_PENDING ensures the tasks keep being posted (by Refresh()).
635 if (update_state_ == IDLE) { 684 if (update_state_ == IDLE) {
636 MessageLoop::current()->PostTask( 685 MessageLoop::current()->PostTask(
637 FROM_HERE, 686 FROM_HERE,
638 base::Bind(&TaskManagerModel::Refresh, this)); 687 base::Bind(&TaskManagerModel::Refresh, this));
639 } 688 }
640 update_state_ = TASK_PENDING; 689 update_state_ = TASK_PENDING;
641 690
642 // Notify resource providers that we are updating. 691 // Notify resource providers that we are updating.
643 for (ResourceProviderList::iterator iter = providers_.begin(); 692 StartListening();
644 iter != providers_.end(); ++iter) {
645 (*iter)->StartUpdating();
646 }
647 693
648 if (!resources_.empty()) { 694 if (!resources_.empty()) {
649 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_, 695 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_,
650 OnReadyPeriodicalUpdate()); 696 OnReadyPeriodicalUpdate());
651 } 697 }
652 } 698 }
653 699
654 void TaskManagerModel::StopUpdating() { 700 void TaskManagerModel::StopUpdating() {
655 // Don't actually stop updating until we have heard as many calls as those 701 // Don't actually stop updating until we have heard as many calls as those
656 // to StartUpdating. 702 // to StartUpdating.
657 update_requests_--; 703 update_requests_--;
658 if (update_requests_ > 0) 704 if (update_requests_ > 0)
659 return; 705 return;
660 // Make sure that update_requests_ cannot go negative. 706 // Make sure that update_requests_ cannot go negative.
661 CHECK_EQ(0, update_requests_); 707 CHECK_EQ(0, update_requests_);
662 DCHECK_EQ(TASK_PENDING, update_state_); 708 DCHECK_EQ(TASK_PENDING, update_state_);
663 update_state_ = STOPPING; 709 update_state_ = STOPPING;
664 710
665 // Notify resource providers that we are done updating. 711 // Notify resource providers that we are done updating.
666 for (ResourceProviderList::const_iterator iter = providers_.begin(); 712 StopListening();
667 iter != providers_.end(); ++iter) {
668 (*iter)->StopUpdating();
669 }
670
671 // Must clear the resources before the next attempt to start updating.
672 Clear();
673 } 713 }
674 714
675 void TaskManagerModel::AddResourceProvider( 715 void TaskManagerModel::AddResourceProvider(
676 TaskManager::ResourceProvider* provider) { 716 TaskManager::ResourceProvider* provider) {
677 DCHECK(provider); 717 DCHECK(provider);
678 providers_.push_back(provider); 718 providers_.push_back(provider);
679 } 719 }
680 720
681 void TaskManagerModel::AddResource(TaskManager::Resource* resource) { 721 void TaskManagerModel::AddResource(TaskManager::Resource* resource) {
682 resource->unique_id_ = ++last_unique_id_; 722 resource->unique_id_ = ++last_unique_id_;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 if (pm_iter != metrics_map_.end()) { 792 if (pm_iter != metrics_map_.end()) {
753 delete pm_iter->second; 793 delete pm_iter->second;
754 metrics_map_.erase(process); 794 metrics_map_.erase(process);
755 } 795 }
756 // And we don't need the CPU usage anymore either. 796 // And we don't need the CPU usage anymore either.
757 CPUUsageMap::iterator cpu_iter = cpu_usage_map_.find(process); 797 CPUUsageMap::iterator cpu_iter = cpu_usage_map_.find(process);
758 if (cpu_iter != cpu_usage_map_.end()) 798 if (cpu_iter != cpu_usage_map_.end())
759 cpu_usage_map_.erase(cpu_iter); 799 cpu_usage_map_.erase(cpu_iter);
760 } 800 }
761 801
762 // Remove the entry from the model list. 802 // Prepare to remove the entry from the model list.
763 iter = std::find(resources_.begin(), resources_.end(), resource); 803 iter = std::find(resources_.begin(), resources_.end(), resource);
764 DCHECK(iter != resources_.end()); 804 DCHECK(iter != resources_.end());
765 int index = static_cast<int>(iter - resources_.begin()); 805 int index = static_cast<int>(iter - resources_.begin());
806
807 // Notify the observers that the contents will change.
808 FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_,
809 OnItemsToBeRemoved(index, 1));
810
811 // Now actually remove the entry from the model list.
766 resources_.erase(iter); 812 resources_.erase(iter);
767 813
768 // Remove the entry from the network maps. 814 // Remove the entry from the network maps.
769 ResourceValueMap::iterator net_iter = 815 ResourceValueMap::iterator net_iter =
770 current_byte_count_map_.find(resource); 816 current_byte_count_map_.find(resource);
771 if (net_iter != current_byte_count_map_.end()) 817 if (net_iter != current_byte_count_map_.end())
772 current_byte_count_map_.erase(net_iter); 818 current_byte_count_map_.erase(net_iter);
773 net_iter = displayed_network_usage_map_.find(resource); 819 net_iter = displayed_network_usage_map_.find(resource);
774 if (net_iter != displayed_network_usage_map_.end()) 820 if (net_iter != displayed_network_usage_map_.end())
775 displayed_network_usage_map_.erase(net_iter); 821 displayed_network_usage_map_.erase(net_iter);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 int64 TaskManagerModel::GetNetworkUsageForResource( 965 int64 TaskManagerModel::GetNetworkUsageForResource(
920 TaskManager::Resource* resource) const { 966 TaskManager::Resource* resource) const {
921 ResourceValueMap::const_iterator iter = 967 ResourceValueMap::const_iterator iter =
922 displayed_network_usage_map_.find(resource); 968 displayed_network_usage_map_.find(resource);
923 if (iter == displayed_network_usage_map_.end()) 969 if (iter == displayed_network_usage_map_.end())
924 return 0; 970 return 0;
925 return iter->second; 971 return iter->second;
926 } 972 }
927 973
928 void TaskManagerModel::BytesRead(BytesReadParam param) { 974 void TaskManagerModel::BytesRead(BytesReadParam param) {
929 if (update_state_ != TASK_PENDING) { 975 if (update_state_ != TASK_PENDING || listen_requests_ == 0) {
930 // A notification sneaked in while we were stopping the updating, just 976 // A notification sneaked in while we were stopping the updating, just
931 // ignore it. 977 // ignore it.
932 return; 978 return;
933 } 979 }
934 980
935 if (param.byte_count == 0) { 981 if (param.byte_count == 0) {
936 // Nothing to do if no bytes were actually read. 982 // Nothing to do if no bytes were actually read.
937 return; 983 return;
938 } 984 }
939 985
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1166 // Count the number of extensions with background pages (including 1212 // Count the number of extensions with background pages (including
1167 // incognito). 1213 // incognito).
1168 count += CountExtensionBackgroundPagesForProfile(profile); 1214 count += CountExtensionBackgroundPagesForProfile(profile);
1169 if (profile->HasOffTheRecordProfile()) { 1215 if (profile->HasOffTheRecordProfile()) {
1170 count += CountExtensionBackgroundPagesForProfile( 1216 count += CountExtensionBackgroundPagesForProfile(
1171 profile->GetOffTheRecordProfile()); 1217 profile->GetOffTheRecordProfile());
1172 } 1218 }
1173 } 1219 }
1174 return count; 1220 return count;
1175 } 1221 }
OLDNEW
« no previous file with comments | « chrome/browser/task_manager/task_manager.h ('k') | chrome/browser/task_manager/task_manager_resource_providers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698