diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-28 22:00:40 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-28 22:00:40 +0000 |
commit | f4eaf7b97ff394ed43b4dcfbc3d0fc5742a42c0c (patch) | |
tree | ec7d838aac13db04e76e066b43cd217d90600260 /content/browser/browser_child_process_host_impl.cc | |
parent | 82219ddbdcd14c65e9bc4b99e63ee02084caa772 (diff) | |
download | chromium_src-f4eaf7b97ff394ed43b4dcfbc3d0fc5742a42c0c.zip chromium_src-f4eaf7b97ff394ed43b4dcfbc3d0fc5742a42c0c.tar.gz chromium_src-f4eaf7b97ff394ed43b4dcfbc3d0fc5742a42c0c.tar.bz2 |
content: convert child process notifications to observer usage
BUG=170921
Review URL: https://codereview.chromium.org/12212089
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185337 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/browser_child_process_host_impl.cc')
-rw-r--r-- | content/browser/browser_child_process_host_impl.cc | 64 |
1 files changed, 45 insertions, 19 deletions
diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc index f752330..12712be 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 } |