summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-24 18:34:43 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-24 18:34:43 +0000
commit191bf6db1f6315421c216dcd90e2aaa3d198cd14 (patch)
tree19f0e9add91673e3e3fa0538ba05882777651af3 /chrome
parent2d3baf01ef4f8ec59e7be0e253158dfdb2a98a35 (diff)
downloadchromium_src-191bf6db1f6315421c216dcd90e2aaa3d198cd14.zip
chromium_src-191bf6db1f6315421c216dcd90e2aaa3d198cd14.tar.gz
chromium_src-191bf6db1f6315421c216dcd90e2aaa3d198cd14.tar.bz2
If a RenderWidgetHelper::PaintMsgProxy is deleted without being Run, then the
RenderWidgetHelper gets angry. This change allows the PaintMsgProxy to be deleted without being Run. This change is to support deleting all tasks that have made it into a MessageLoop without being Run. Currently, we leak those tasks, but I'd like to change that to allow us to avoid some hacks that exist to help Purify. R=brettw BUG=2734 Review URL: http://codereview.chromium.org/4251 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2558 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/render_widget_helper.cc19
-rw-r--r--chrome/browser/render_widget_helper.h3
2 files changed, 19 insertions, 3 deletions
diff --git a/chrome/browser/render_widget_helper.cc b/chrome/browser/render_widget_helper.cc
index 6536220..d2554e6 100644
--- a/chrome/browser/render_widget_helper.cc
+++ b/chrome/browser/render_widget_helper.cc
@@ -19,9 +19,18 @@ class RenderWidgetHelper::PaintMsgProxy : public Task {
cancelled(false) {
}
+ ~PaintMsgProxy() {
+ // If the paint message was never dispatched, then we need to let the
+ // helper know that we are going away.
+ if (!cancelled && helper)
+ helper->OnDiscardPaintMsg(this);
+ }
+
virtual void Run() {
- if (!cancelled)
+ if (!cancelled) {
helper->OnDispatchPaintMsg(this);
+ helper = NULL;
+ }
}
scoped_refptr<RenderWidgetHelper> helper;
@@ -141,7 +150,7 @@ void RenderWidgetHelper::DidReceivePaintMsg(const IPC::Message& msg) {
ui_loop_->PostTask(FROM_HERE, proxy);
}
-void RenderWidgetHelper::OnDispatchPaintMsg(PaintMsgProxy* proxy) {
+void RenderWidgetHelper::OnDiscardPaintMsg(PaintMsgProxy* proxy) {
const IPC::Message& msg = proxy->message;
// Remove the proxy from the map now that we are going to handle it normally.
@@ -154,11 +163,15 @@ void RenderWidgetHelper::OnDispatchPaintMsg(PaintMsgProxy* proxy) {
pending_paints_.erase(it);
}
+}
+
+void RenderWidgetHelper::OnDispatchPaintMsg(PaintMsgProxy* proxy) {
+ OnDiscardPaintMsg(proxy);
// It is reasonable for the host to no longer exist.
RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_);
if (host)
- host->OnMessageReceived(msg);
+ host->OnMessageReceived(proxy->message);
}
void RenderWidgetHelper::OnCancelResourceRequests(
diff --git a/chrome/browser/render_widget_helper.h b/chrome/browser/render_widget_helper.h
index c7763b4..6098289 100644
--- a/chrome/browser/render_widget_helper.h
+++ b/chrome/browser/render_widget_helper.h
@@ -121,6 +121,9 @@ class RenderWidgetHelper :
// Map from render_widget_id to live PaintMsgProxy instance.
typedef base::hash_map<int, PaintMsgProxy*> PaintMsgProxyMap;
+ // Called on the UI thread to discard a paint message.
+ void OnDiscardPaintMsg(PaintMsgProxy* proxy);
+
// Called on the UI thread to dispatch a paint message if necessary.
void OnDispatchPaintMsg(PaintMsgProxy* proxy);