summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-02 04:53:59 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-02 04:53:59 +0000
commiteb6f2c542d7405788d668a762282b66655836e1d (patch)
tree3e7558d38c45c9e9620455669444b2755d608413 /chrome/renderer
parent63af5a4251dfae13ae831d87c68b201e70a49530 (diff)
downloadchromium_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
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/renderer_webkitclient_impl.cc13
-rw-r--r--chrome/renderer/renderer_webkitclient_impl.h8
2 files changed, 21 insertions, 0 deletions
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_