Index: content/renderer/renderer_main.cc |
=================================================================== |
--- content/renderer/renderer_main.cc (revision 131514) |
+++ content/renderer/renderer_main.cc (working copy) |
@@ -69,6 +69,28 @@ |
} |
} // namespace |
+ |
+class SuicideOnChannelErrorFilter : public IPC::ChannelProxy::MessageFilter { |
+ void OnChannelError() { |
+ // On POSIX, at least, one can install an unload handler which loops |
+ // forever and leave behind a renderer process which eats 100% CPU forever. |
+ // |
+ // This is because the terminate signals (ViewMsg_ShouldClose and the error |
+ // from the IPC channel) are routed to the main message loop but never |
+ // processed (because that message loop is stuck in V8). |
+ // |
+ // One could make the browser SIGKILL the renderers, but that leaves open a |
+ // large window where a browser failure (or a user, manually terminating |
+ // the browser because "it's stuck") will leave behind a process eating all |
+ // the CPU. |
+ // |
+ // So, we install a filter on the channel so that we can process this event |
+ // here and kill the process. |
+ |
+ _exit(0); |
+ } |
+}; |
+ |
#endif // OS_MACOSX |
// This function provides some ways to test crash and assertion handling |
@@ -228,6 +250,10 @@ |
new RenderThreadImpl(); |
#endif |
+#if defined(OS_POSIX) |
+ RenderThreadImpl::current()->AddFilter(new SuicideOnChannelErrorFilter()); |
+#endif |
+ |
platform.RunSandboxTests(); |
startup_timer.Stop(); // End of Startup Time Measurement. |