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

Unified Diff: content/browser/renderer_host/render_process_host_impl.cc

Issue 72203003: Introduce RenderProcessHostObserver, use it in its first client. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: release mode Created 7 years, 1 month 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: content/browser/renderer_host/render_process_host_impl.cc
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 6070b22041d7163262db24900b90fd03d5cc1e97..5d149748765bbd7a598edbc56aad0473a6c9206c 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -117,6 +117,7 @@
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "content/public/browser/render_process_host_factory.h"
+#include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_iterator.h"
#include "content/public/browser/resource_context.h"
@@ -359,6 +360,9 @@ RenderProcessHostImpl::RenderProcessHostImpl(
bool is_guest)
: fast_shutdown_started_(false),
deleting_soon_(false),
+#ifndef NDEBUG
+ is_self_deleted_(false),
+#endif
pending_views_(0),
visible_widgets_(0),
backgrounded_(true),
@@ -400,6 +404,11 @@ RenderProcessHostImpl::RenderProcessHostImpl(
}
RenderProcessHostImpl::~RenderProcessHostImpl() {
+#ifndef NDEBUG
+ DCHECK(is_self_deleted_)
+ << "RenderProcessHostImpl is destroyed by something other than itself";
+#endif
+
ChildProcessSecurityPolicyImpl::GetInstance()->Remove(GetID());
if (gpu_observer_registered_) {
@@ -771,6 +780,15 @@ void RenderProcessHostImpl::RemoveRoute(int32 routing_id) {
Cleanup();
}
+void RenderProcessHostImpl::AddObserver(RenderProcessHostObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void RenderProcessHostImpl::RemoveObserver(
+ RenderProcessHostObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
bool RenderProcessHostImpl::WaitForBackingStoreMsg(
int render_widget_id,
const base::TimeDelta& max_delay,
@@ -1358,14 +1376,20 @@ bool RenderProcessHostImpl::IgnoreInputEvents() const {
}
void RenderProcessHostImpl::Cleanup() {
- // When no other owners of this object, we can delete ourselves
+ // When there are no other owners of this object, we can delete ourselves.
if (listeners_.IsEmpty()) {
DCHECK_EQ(0, pending_views_);
+ FOR_EACH_OBSERVER(RenderProcessHostObserver,
+ observers_,
+ RenderProcessHostDestroyed(this));
NotificationService::current()->Notify(
NOTIFICATION_RENDERER_PROCESS_TERMINATED,
Source<RenderProcessHost>(this),
NotificationService::NoDetails());
+#ifndef NDEBUG
+ is_self_deleted_ = true;
+#endif
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
deleting_soon_ = true;
// It's important not to wait for the DeleteTask to delete the channel
@@ -1514,6 +1538,32 @@ void RenderProcessHost::SetRunRendererInProcess(bool value) {
}
}
+// static
+void RenderProcessHost::ShutDownInProcessRenderer() {
+ DCHECK(g_run_renderer_in_process_);
+
+ switch (g_all_hosts.Pointer()->size()) {
jam 2013/11/18 19:16:20 nit: isn't size() always == 1? can you just make t
Avi (use Gerrit) 2013/11/18 19:22:21 Is it? It's valid to shut down even if there never
+ case 0:
+ return;
+ case 1: {
+ RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>(
+ AllHostsIterator().GetCurrentValue());
+ FOR_EACH_OBSERVER(RenderProcessHostObserver,
+ host->observers_,
+ RenderProcessHostDestroyed(host));
+#ifndef NDEBUG
+ host->is_self_deleted_ = true;
+#endif
+ delete host;
+ return;
+ }
+ default:
+ NOTREACHED() << "There should be only one RenderProcessHost when running "
+ << "in-process.";
+ }
+}
+
+// static
RenderProcessHost::iterator RenderProcessHost::AllHostsIterator() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
return iterator(g_all_hosts.Pointer());

Powered by Google App Engine
This is Rietveld 408576698