Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Unified Diff: content/browser/renderer_host/render_widget_resize_helper.cc

Issue 399213003: Fix crash in Mac ASAN RenderWidgetResizeHelper (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move_to_cpp
Patch Set: Fix name Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_resize_helper.cc
diff --git a/content/browser/renderer_host/render_widget_resize_helper.cc b/content/browser/renderer_host/render_widget_resize_helper.cc
index f5e6ff5317f3301c27d90ea16231a87362fdf2d3..421c2fa256f458c185ccd815b8c1fee153f74b77 100644
--- a/content/browser/renderer_host/render_widget_resize_helper.cc
+++ b/content/browser/renderer_host/render_widget_resize_helper.cc
@@ -34,6 +34,9 @@ class RenderWidgetResizeHelper::EnqueuedTask {
int process_id_;
IPC::Message message_;
bool has_run_;
+
+ // Back-pointer to the ResizeHelper which has this task in its queue. Set
+ // to NULL when this task is removed from the queue.
RenderWidgetResizeHelper* helper_;
DISALLOW_COPY_AND_ASSIGN(EnqueuedTask);
@@ -51,6 +54,12 @@ RenderWidgetResizeHelper::EnqueuedTask::EnqueuedTask(
}
RenderWidgetResizeHelper::EnqueuedTask::~EnqueuedTask() {
+ // Note that if the MessageLoop into which this task was posted is destroyed
+ // before the RenderWidgetResizeHelper, then the helper's list of tasks will
+ // point to freed data. Avoid this by removing tasks when they are freed, if
+ // they weren't already removed when they were run.
+ if (helper_)
+ helper_->RemoveEnqueuedTaskFromQueue(this);
}
void RenderWidgetResizeHelper::EnqueuedTask::Run() {
@@ -58,7 +67,7 @@ void RenderWidgetResizeHelper::EnqueuedTask::Run() {
return;
if (helper_)
- helper_->WillRunEnqueuedTask(this);
+ helper_->RemoveEnqueuedTaskFromQueue(this);
has_run_ = true;
switch (type_) {
@@ -133,10 +142,11 @@ void RenderWidgetResizeHelper::PostEnqueuedTask(EnqueuedTask* task) {
base::Bind(&EnqueuedTask::Run, base::Owned(task)));
}
-void RenderWidgetResizeHelper::WillRunEnqueuedTask(EnqueuedTask* task) {
+void RenderWidgetResizeHelper::RemoveEnqueuedTaskFromQueue(EnqueuedTask* task) {
base::AutoLock lock(task_queue_lock_);
DCHECK(task_queue_.front() == task);
task_queue_.pop_front();
+ task->InvalidateHelper();
}
void RenderWidgetResizeHelper::PostRendererProcessMsg(
« no previous file with comments | « content/browser/renderer_host/render_widget_resize_helper.h ('k') | content/test/content_browser_test_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698