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

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

Issue 12212089: content: convert child process notifications to observer usage (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: private Created 7 years, 9 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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_resource_providers.h" 5 #include "chrome/browser/task_manager/task_manager_resource_providers.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 if (iter != pid_to_resources_.end()) 1204 if (iter != pid_to_resources_.end())
1205 return iter->second; 1205 return iter->second;
1206 else 1206 else
1207 return NULL; 1207 return NULL;
1208 } 1208 }
1209 1209
1210 void TaskManagerChildProcessResourceProvider::StartUpdating() { 1210 void TaskManagerChildProcessResourceProvider::StartUpdating() {
1211 DCHECK(!updating_); 1211 DCHECK(!updating_);
1212 updating_ = true; 1212 updating_ = true;
1213 1213
1214 // Register for notifications to get new child processes.
1215 registrar_.Add(this, content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED,
1216 content::NotificationService::AllBrowserContextsAndSources());
1217 registrar_.Add(this, content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED,
1218 content::NotificationService::AllBrowserContextsAndSources());
1219
1220 // Get the existing child processes. 1214 // Get the existing child processes.
1221 BrowserThread::PostTask( 1215 BrowserThread::PostTask(
1222 BrowserThread::IO, FROM_HERE, 1216 BrowserThread::IO, FROM_HERE,
1223 base::Bind( 1217 base::Bind(
1224 &TaskManagerChildProcessResourceProvider::RetrieveChildProcessData, 1218 &TaskManagerChildProcessResourceProvider::RetrieveChildProcessData,
1225 this)); 1219 this));
1220
1221 BrowserChildProcessObserver::Add(this);
1226 } 1222 }
1227 1223
1228 void TaskManagerChildProcessResourceProvider::StopUpdating() { 1224 void TaskManagerChildProcessResourceProvider::StopUpdating() {
1229 DCHECK(updating_); 1225 DCHECK(updating_);
1230 updating_ = false; 1226 updating_ = false;
1231 1227
1232 // Unregister for notifications to get new plugin processes.
1233 registrar_.Remove(
1234 this, content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED,
1235 content::NotificationService::AllBrowserContextsAndSources());
1236 registrar_.Remove(
1237 this,
1238 content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED,
1239 content::NotificationService::AllBrowserContextsAndSources());
1240
1241 // Delete all the resources. 1228 // Delete all the resources.
1242 STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end()); 1229 STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
1243 1230
1244 resources_.clear(); 1231 resources_.clear();
1245 pid_to_resources_.clear(); 1232 pid_to_resources_.clear();
1233
1234 BrowserChildProcessObserver::Remove(this);
1246 } 1235 }
1247 1236
1248 void TaskManagerChildProcessResourceProvider::Observe( 1237 void TaskManagerChildProcessResourceProvider::BrowserChildProcessHostConnected(
1249 int type, 1238 const content::ChildProcessData& data) {
1250 const content::NotificationSource& source, 1239 DCHECK(updating_);
1251 const content::NotificationDetails& details) {
1252 content::ChildProcessData data =
1253 *content::Details<content::ChildProcessData>(details).ptr();
1254 switch (type) {
1255 case content::NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED:
1256 Add(data);
1257 break;
1258 case content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED:
1259 Remove(data);
1260 break;
1261 default:
1262 NOTREACHED() << "Unexpected notification.";
1263 return;
1264 }
1265 }
1266 1240
1267 void TaskManagerChildProcessResourceProvider::Add( 1241 // Workers are handled by TaskManagerWorkerResourceProvider.
1268 const content::ChildProcessData& child_process_data) { 1242 if (data.type == content::PROCESS_TYPE_WORKER)
1269 if (!updating_)
1270 return; 1243 return;
1271 // Workers are handled by TaskManagerWorkerResourceProvider. 1244 if (resources_.count(data.handle)) {
1272 if (child_process_data.type == content::PROCESS_TYPE_WORKER)
1273 return;
1274 if (resources_.count(child_process_data.handle)) {
1275 // The case may happen that we have added a child_process_info as part of 1245 // The case may happen that we have added a child_process_info as part of
1276 // the iteration performed during StartUpdating() call but the notification 1246 // the iteration performed during StartUpdating() call but the notification
1277 // that it has connected was not fired yet. So when the notification 1247 // that it has connected was not fired yet. So when the notification
1278 // happens, we already know about this plugin and just ignore it. 1248 // happens, we already know about this plugin and just ignore it.
1279 return; 1249 return;
1280 } 1250 }
1281 AddToTaskManager(child_process_data); 1251 AddToTaskManager(data);
1282 } 1252 }
1283 1253
1284 void TaskManagerChildProcessResourceProvider::Remove( 1254 void TaskManagerChildProcessResourceProvider::
1285 const content::ChildProcessData& child_process_data) { 1255 BrowserChildProcessHostDisconnected(const content::ChildProcessData& data) {
1286 if (!updating_) 1256 DCHECK(updating_);
1257
1258 if (data.type == content::PROCESS_TYPE_WORKER)
1287 return; 1259 return;
1288 if (child_process_data.type == content::PROCESS_TYPE_WORKER) 1260 ChildProcessMap::iterator iter = resources_.find(data.handle);
1289 return;
1290 ChildProcessMap::iterator iter = resources_.find(child_process_data.handle);
1291 if (iter == resources_.end()) { 1261 if (iter == resources_.end()) {
1292 // ChildProcessData disconnection notifications are asynchronous, so we 1262 // ChildProcessData disconnection notifications are asynchronous, so we
1293 // might be notified for a plugin we don't know anything about (if it was 1263 // might be notified for a plugin we don't know anything about (if it was
1294 // closed before the task manager was shown and destroyed after that). 1264 // closed before the task manager was shown and destroyed after that).
1295 return; 1265 return;
1296 } 1266 }
1297 // Remove the resource from the Task Manager. 1267 // Remove the resource from the Task Manager.
1298 TaskManagerChildProcessResource* resource = iter->second; 1268 TaskManagerChildProcessResource* resource = iter->second;
1299 task_manager_->RemoveResource(resource); 1269 task_manager_->RemoveResource(resource);
1300 // Remove it from the provider. 1270 // Remove it from the provider.
(...skipping 22 matching lines...) Expand all
1323 task_manager_->AddResource(resource); 1293 task_manager_->AddResource(resource);
1324 } 1294 }
1325 1295
1326 // The ChildProcessData::Iterator has to be used from the IO thread. 1296 // The ChildProcessData::Iterator has to be used from the IO thread.
1327 void TaskManagerChildProcessResourceProvider::RetrieveChildProcessData() { 1297 void TaskManagerChildProcessResourceProvider::RetrieveChildProcessData() {
1328 std::vector<content::ChildProcessData> child_processes; 1298 std::vector<content::ChildProcessData> child_processes;
1329 for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) { 1299 for (BrowserChildProcessHostIterator iter; !iter.Done(); ++iter) {
1330 // Only add processes which are already started, since we need their handle. 1300 // Only add processes which are already started, since we need their handle.
1331 if (iter.GetData().handle == base::kNullProcessHandle) 1301 if (iter.GetData().handle == base::kNullProcessHandle)
1332 continue; 1302 continue;
1303 if (iter.GetData().type == content::PROCESS_TYPE_WORKER)
1304 continue;
1333 child_processes.push_back(iter.GetData()); 1305 child_processes.push_back(iter.GetData());
1334 } 1306 }
1335 // Now notify the UI thread that we have retrieved information about child 1307 // Now notify the UI thread that we have retrieved information about child
1336 // processes. 1308 // processes.
1337 BrowserThread::PostTask( 1309 BrowserThread::PostTask(
1338 BrowserThread::UI, FROM_HERE, 1310 BrowserThread::UI, FROM_HERE,
1339 base::Bind( 1311 base::Bind(
1340 &TaskManagerChildProcessResourceProvider::ChildProcessDataRetreived, 1312 &TaskManagerChildProcessResourceProvider::ChildProcessDataRetreived,
1341 this, child_processes)); 1313 this, child_processes));
1342 } 1314 }
1343 1315
1344 // This is called on the UI thread. 1316 // This is called on the UI thread.
1345 void TaskManagerChildProcessResourceProvider::ChildProcessDataRetreived( 1317 void TaskManagerChildProcessResourceProvider::ChildProcessDataRetreived(
1346 const std::vector<content::ChildProcessData>& child_processes) { 1318 const std::vector<content::ChildProcessData>& child_processes) {
1347 for (size_t i = 0; i < child_processes.size(); ++i) 1319 for (size_t i = 0; i < child_processes.size(); ++i)
1348 Add(child_processes[i]); 1320 AddToTaskManager(child_processes[i]);
1349 1321
1350 content::NotificationService::current()->Notify( 1322 content::NotificationService::current()->Notify(
1351 chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY, 1323 chrome::NOTIFICATION_TASK_MANAGER_CHILD_PROCESSES_DATA_READY,
1352 content::Source<TaskManagerChildProcessResourceProvider>(this), 1324 content::Source<TaskManagerChildProcessResourceProvider>(this),
1353 content::NotificationService::NoDetails()); 1325 content::NotificationService::NoDetails());
1354 } 1326 }
1355 1327
1356 //////////////////////////////////////////////////////////////////////////////// 1328 ////////////////////////////////////////////////////////////////////////////////
1357 // TaskManagerExtensionProcessResource class 1329 // TaskManagerExtensionProcessResource class
1358 //////////////////////////////////////////////////////////////////////////////// 1330 ////////////////////////////////////////////////////////////////////////////////
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 case content::NOTIFICATION_WEB_CONTENTS_CONNECTED: 1898 case content::NOTIFICATION_WEB_CONTENTS_CONNECTED:
1927 Add(web_contents->GetRenderViewHost()); 1899 Add(web_contents->GetRenderViewHost());
1928 break; 1900 break;
1929 case content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED: 1901 case content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED:
1930 Remove(web_contents->GetRenderViewHost()); 1902 Remove(web_contents->GetRenderViewHost());
1931 break; 1903 break;
1932 default: 1904 default:
1933 NOTREACHED() << "Unexpected notification."; 1905 NOTREACHED() << "Unexpected notification.";
1934 } 1906 }
1935 } 1907 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698