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

Unified 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: Improved task manager sample and minor cleanup. Created 8 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/task_manager/task_manager.cc
diff --git a/chrome/browser/task_manager/task_manager.cc b/chrome/browser/task_manager/task_manager.cc
index 5ba8f202c2dce56dc4704ff3fa035be9d7998c2b..c2df31d9b98146634852a38907271a1cd047d654 100644
--- a/chrome/browser/task_manager/task_manager.cc
+++ b/chrome/browser/task_manager/task_manager.cc
@@ -83,7 +83,9 @@ string16 FormatStatsSize(const WebKit::WebCache::ResourceTypeStat& stat) {
TaskManagerModel::TaskManagerModel(TaskManager* task_manager)
: update_requests_(0),
+ listen_requests_(0),
update_state_(IDLE),
+ is_listening_(false),
goat_salt_(base::RandUint64()),
last_unique_id_(0) {
AddResourceProvider(
@@ -208,6 +210,11 @@ int TaskManagerModel::GetProcessId(int index) const {
return base::GetProcId(resources_[index]->GetProcess());
}
+base::ProcessHandle TaskManagerModel::GetProcess(int index) const {
+ CHECK_LT(index, ResourceCount());
+ return resources_[index]->GetProcess();
+}
+
string16 TaskManagerModel::GetResourceProcessId(int index) const {
return base::IntToString16(GetProcessId(index));
}
@@ -586,6 +593,15 @@ bool TaskManagerModel::GetV8Memory(int index, size_t* result) const {
return true;
}
+bool TaskManagerModel::GetV8MemoryUsed(int index, size_t* result) const {
+ *result = 0;
+ if (!resources_[index]->ReportsV8MemoryStats())
+ return false;
+
+ *result = resources_[index]->GetV8MemoryUsed();
+ return true;
+}
+
bool TaskManagerModel::CanActivate(int index) const {
CHECK_LT(index, ResourceCount());
return GetResourceTabContents(index) != NULL;
@@ -620,6 +636,45 @@ string16 TaskManagerModel::GetMemCellText(int64 number) const {
#endif
}
+void TaskManagerModel::StartListening() {
+ // Multiple StartListening requests may come in and we only need to take
+ // action the first time.
+ listen_requests_++;
+ if (listen_requests_ > 1)
+ return;
+ DCHECK_EQ(1, listen_requests_);
+ DCHECK(!is_listening_);
+
+ is_listening_ = true;
+
+ // Notify resource providers that we should start listening to events.
+ for (ResourceProviderList::iterator iter = providers_.begin();
+ iter != providers_.end(); ++iter) {
+ (*iter)->StartUpdating();
+ }
+}
+
+void TaskManagerModel::StopListening() {
+ // Don't actually stop listening until we have heard as many calls as those
+ // to StartListening.
+ listen_requests_--;
+ if (listen_requests_ > 0)
+ return;
+
+ CHECK_EQ(0, listen_requests_);
Charlie Reis 2012/05/04 20:41:30 Is there a reason this one is a CHECK and the rest
nasko 2012/05/07 17:08:47 No real reason. Probably an editing mistake. Thank
+ DCHECK(is_listening_);
+ is_listening_ = false;
+
+ // Notify resource providers that we are done listening.
+ for (ResourceProviderList::const_iterator iter = providers_.begin();
+ iter != providers_.end(); ++iter) {
+ (*iter)->StopUpdating();
+ }
+
+ // Must clear the resources before the next attempt to start listening.
+ Clear();
+}
+
void TaskManagerModel::StartUpdating() {
// Multiple StartUpdating requests may come in, and we only need to take
// action the first time.
@@ -639,10 +694,7 @@ void TaskManagerModel::StartUpdating() {
update_state_ = TASK_PENDING;
// Notify resource providers that we are updating.
- for (ResourceProviderList::iterator iter = providers_.begin();
- iter != providers_.end(); ++iter) {
- (*iter)->StartUpdating();
- }
+ StartListening();
if (!resources_.empty()) {
FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_,
@@ -662,13 +714,7 @@ void TaskManagerModel::StopUpdating() {
update_state_ = STOPPING;
// Notify resource providers that we are done updating.
- for (ResourceProviderList::const_iterator iter = providers_.begin();
- iter != providers_.end(); ++iter) {
- (*iter)->StopUpdating();
- }
-
- // Must clear the resources before the next attempt to start updating.
- Clear();
+ StopListening();
}
void TaskManagerModel::AddResourceProvider(
@@ -758,10 +804,16 @@ void TaskManagerModel::RemoveResource(TaskManager::Resource* resource) {
cpu_usage_map_.erase(cpu_iter);
}
- // Remove the entry from the model list.
+ // Prepare to remove the entry from the model list.
iter = std::find(resources_.begin(), resources_.end(), resource);
DCHECK(iter != resources_.end());
int index = static_cast<int>(iter - resources_.begin());
+
+ // Notify the observers that the contents will change.
+ FOR_EACH_OBSERVER(TaskManagerModelObserver, observer_list_,
+ OnItemsToBeRemoved(index, 1));
+
+ // Now actually remove the entry from the model list.
resources_.erase(iter);
// Remove the entry from the network maps.
@@ -925,7 +977,7 @@ int64 TaskManagerModel::GetNetworkUsageForResource(
}
void TaskManagerModel::BytesRead(BytesReadParam param) {
- if (update_state_ != TASK_PENDING) {
+ if (update_state_ != TASK_PENDING || !is_listening_) {
// A notification sneaked in while we were stopping the updating, just
// ignore it.
return;

Powered by Google App Engine
This is Rietveld 408576698