diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-02 04:53:59 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-02 04:53:59 +0000 |
commit | eb6f2c542d7405788d668a762282b66655836e1d (patch) | |
tree | 3e7558d38c45c9e9620455669444b2755d608413 | |
parent | 63af5a4251dfae13ae831d87c68b201e70a49530 (diff) | |
download | chromium_src-eb6f2c542d7405788d668a762282b66655836e1d.zip chromium_src-eb6f2c542d7405788d668a762282b66655836e1d.tar.gz chromium_src-eb6f2c542d7405788d668a762282b66655836e1d.tar.bz2 |
Make sudden termination into a counter.
We were incorrectly interpreting enableSuddenTermination to mean "enable sudden termination". Really it should just decrement a counter, and we should only enable sudden termination when that counter reaches 0.
Related to, but not the fix for, http://crbug.com/5638
This may have been causing memory corruption due to shutting down the renderer process while writing to a storage area or icon database (although honestly I don't actually know if we even use those parts of webkit).
Also, add a ui test that fails before this patch and succeeds with this patch.
BUG=none
TEST=sudden termination still works on a simple page
Review URL: http://codereview.chromium.org/245036
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27831 0039d316-1c4b-4281-b951-d872f2087c98
-rwxr-xr-x | chrome/chrome.gyp | 2 | ||||
-rw-r--r-- | chrome/renderer/renderer_webkitclient_impl.cc | 13 | ||||
-rw-r--r-- | chrome/renderer/renderer_webkitclient_impl.h | 8 |
3 files changed, 23 insertions, 0 deletions
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index cae4673..4d8879d 100755 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -4025,6 +4025,7 @@ 'test/reliability/page_load_test.cc', 'test/reliability/page_load_test.h', 'test/ui/dom_checker_uitest.cc', + 'test/ui/fast_shutdown_uitest.cc', 'test/ui/history_uitest.cc', 'test/ui/layout_plugin_uitest.cc', 'test/ui/npapi_uitest.cc', @@ -4072,6 +4073,7 @@ # puts up modal dialogs. 'browser/unload_uitest.cc', 'test/reliability/page_load_test.cc', + 'test/ui/fast_shutdown_uitest.cc', 'test/ui/layout_plugin_uitest.cc', 'test/ui/omnibox_uitest.cc', ], diff --git a/chrome/renderer/renderer_webkitclient_impl.cc b/chrome/renderer/renderer_webkitclient_impl.cc index 3907b53..2a2ae60 100644 --- a/chrome/renderer/renderer_webkitclient_impl.cc +++ b/chrome/renderer/renderer_webkitclient_impl.cc @@ -132,6 +132,19 @@ WebString RendererWebKitClientImpl::defaultLocale() { } void RendererWebKitClientImpl::suddenTerminationChanged(bool enabled) { + if (enabled) { + // We should not get more enables than disables, but we want it to be a + // non-fatal error if it does happen. + DCHECK_GT(sudden_termination_disables_, 0); + sudden_termination_disables_ = std::max(--sudden_termination_disables_, 0); + if (sudden_termination_disables_ != 0) + return; + } else { + sudden_termination_disables_++; + if (sudden_termination_disables_ != 1) + return; + } + RenderThread* thread = RenderThread::current(); if (thread) // NULL in unittests. thread->Send(new ViewHostMsg_SuddenTerminationChanged(enabled)); diff --git a/chrome/renderer/renderer_webkitclient_impl.h b/chrome/renderer/renderer_webkitclient_impl.h index d610458..f85ba2f 100644 --- a/chrome/renderer/renderer_webkitclient_impl.h +++ b/chrome/renderer/renderer_webkitclient_impl.h @@ -21,6 +21,8 @@ class RendererWebKitClientImpl : public webkit_glue::WebKitClientImpl { public: + RendererWebKitClientImpl() : sudden_termination_disables_(0) {} + // WebKitClient methods: virtual WebKit::WebClipboard* clipboard(); virtual WebKit::WebMimeRegistry* mimeRegistry(); @@ -89,6 +91,12 @@ class RendererWebKitClientImpl : public webkit_glue::WebKitClientImpl { #if defined(OS_WIN) || defined(OS_LINUX) SandboxSupport sandbox_support_; #endif + + // This counter keeps track of the number of times sudden termination is + // enabled or disabled. It starts at 0 (enabled) and for every disable + // increments by 1, for every enable decrements by 1. When it reaches 0, + // we tell the browser to enable fast termination. + int sudden_termination_disables_; }; #endif // CHROME_RENDERER_WEBKIT_CLIENT_IMPL_H_ |