diff options
author | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-09-24 18:34:43 +0000 |
---|---|---|
committer | darin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-09-24 18:34:43 +0000 |
commit | 191bf6db1f6315421c216dcd90e2aaa3d198cd14 (patch) | |
tree | 19f0e9add91673e3e3fa0538ba05882777651af3 /chrome | |
parent | 2d3baf01ef4f8ec59e7be0e253158dfdb2a98a35 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | chrome/browser/render_widget_helper.h | 3 |
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); |