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

Unified Diff: content/browser/browser_child_process_host_impl.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, 10 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
« no previous file with comments | « content/browser/browser_child_process_host_impl.h ('k') | content/browser/mach_broker_mac.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/browser_child_process_host_impl.cc
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc
index f752330dd7898b6f9d7cec90026c378390ca0a57..12712beef421b86197b3ebdfc98df7c6cfa970c0 100644
--- a/content/browser/browser_child_process_host_impl.cc
+++ b/content/browser/browser_child_process_host_impl.cc
@@ -22,11 +22,10 @@
#include "content/common/child_process_host_impl.h"
#include "content/common/plugin_messages.h"
#include "content/public/browser/browser_child_process_host_delegate.h"
+#include "content/public/browser/browser_child_process_observer.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/child_process_data.h"
#include "content/public/browser/content_browser_client.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_types.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
@@ -40,13 +39,22 @@ namespace {
static base::LazyInstance<BrowserChildProcessHostImpl::BrowserChildProcessList>
g_child_process_list = LAZY_INSTANCE_INITIALIZER;
-// Helper functions since the child process related notifications happen on the
-// UI thread.
-void ChildNotificationHelper(int notification_type,
- const ChildProcessData& data) {
- NotificationService::current()->Notify(
- notification_type, NotificationService::AllSources(),
- Details<const ChildProcessData>(&data));
+base::LazyInstance<ObserverList<BrowserChildProcessObserver> >
+ g_observers = LAZY_INSTANCE_INITIALIZER;
+
+void NotifyProcessHostConnected(const ChildProcessData& data) {
+ FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(),
+ BrowserChildProcessHostConnected(data));
+}
+
+void NotifyProcessHostDisconnected(const ChildProcessData& data) {
+ FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(),
+ BrowserChildProcessHostDisconnected(data));
+}
+
+void NotifyProcessCrashed(const ChildProcessData& data) {
+ FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(),
+ BrowserChildProcessCrashed(data));
}
} // namespace
@@ -63,11 +71,26 @@ base::ProcessMetrics::PortProvider* BrowserChildProcessHost::GetPortProvider() {
}
#endif
+// static
BrowserChildProcessHostImpl::BrowserChildProcessList*
BrowserChildProcessHostImpl::GetIterator() {
return g_child_process_list.Pointer();
}
+// static
+void BrowserChildProcessHostImpl::AddObserver(
+ BrowserChildProcessObserver* observer) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ g_observers.Get().AddObserver(observer);
+}
+
+// static
+void BrowserChildProcessHostImpl::RemoveObserver(
+ BrowserChildProcessObserver* observer) {
+ // TODO(phajdan.jr): Check thread after fixing http://crbug.com/167126.
+ g_observers.Get().RemoveObserver(observer);
+}
+
BrowserChildProcessHostImpl::BrowserChildProcessHostImpl(
ProcessType type,
BrowserChildProcessHostDelegate* delegate)
@@ -182,11 +205,11 @@ void BrowserChildProcessHostImpl::SetTerminateChildOnShutdown(
child_process_->SetTerminateChildOnShutdown(terminate_on_shutdown);
}
-void BrowserChildProcessHostImpl::Notify(int type) {
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&ChildNotificationHelper, type, data_));
+void BrowserChildProcessHostImpl::NotifyProcessInstanceCreated(
+ const ChildProcessData& data) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ FOR_EACH_OBSERVER(BrowserChildProcessObserver, g_observers.Get(),
+ BrowserChildProcessInstanceCreated(data));
}
base::TerminationStatus BrowserChildProcessHostImpl::GetTerminationStatus(
@@ -204,7 +227,9 @@ bool BrowserChildProcessHostImpl::OnMessageReceived(
}
void BrowserChildProcessHostImpl::OnChannelConnected(int32 peer_pid) {
- Notify(NOTIFICATION_CHILD_PROCESS_HOST_CONNECTED);
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&NotifyProcessHostConnected, data_));
delegate_->OnChannelConnected(peer_pid);
}
@@ -217,6 +242,7 @@ bool BrowserChildProcessHostImpl::CanShutdown() {
}
void BrowserChildProcessHostImpl::OnChildDisconnected() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(data_.handle != base::kNullProcessHandle);
int exit_code;
base::TerminationStatus status = GetTerminationStatus(&exit_code);
@@ -224,8 +250,8 @@ void BrowserChildProcessHostImpl::OnChildDisconnected() {
case base::TERMINATION_STATUS_PROCESS_CRASHED:
case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: {
delegate_->OnProcessCrashed(exit_code);
- // Report that this child process crashed.
- Notify(NOTIFICATION_CHILD_PROCESS_CRASHED);
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&NotifyProcessCrashed, data_));
UMA_HISTOGRAM_ENUMERATION("ChildProcess.Crashed",
data_.type,
PROCESS_TYPE_MAX);
@@ -250,8 +276,8 @@ void BrowserChildProcessHostImpl::OnChildDisconnected() {
UMA_HISTOGRAM_ENUMERATION("ChildProcess.Disconnected",
data_.type,
PROCESS_TYPE_MAX);
- // Notify in the main loop of the disconnection.
- Notify(NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED);
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
+ base::Bind(&NotifyProcessHostDisconnected, data_));
delete delegate_; // Will delete us
}
« no previous file with comments | « content/browser/browser_child_process_host_impl.h ('k') | content/browser/mach_broker_mac.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698