Index: content/child/scheduler/task_queue_manager.cc |
diff --git a/content/child/scheduler/task_queue_manager.cc b/content/child/scheduler/task_queue_manager.cc |
index 386ebd0c955cc642f6ea09c8db56d004d33e9a41..ccf7743c402d3308e60bb08cd5a29d42bce24c2b 100644 |
--- a/content/child/scheduler/task_queue_manager.cc |
+++ b/content/child/scheduler/task_queue_manager.cc |
@@ -464,6 +464,7 @@ TaskQueueManager::TaskQueueManager( |
time_source_(nullptr), |
disabled_by_default_tracing_category_( |
disabled_by_default_tracing_category), |
+ deletion_sentinel_(new DeletionSentinel()), |
weak_factory_(this) { |
DCHECK(main_task_runner->RunsTasksOnCurrentThread()); |
TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, |
@@ -576,6 +577,8 @@ void TaskQueueManager::MaybePostDoWorkOnMainRunner() { |
} |
void TaskQueueManager::DoWork(bool posted_from_main_thread) { |
+ scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); |
+ |
if (posted_from_main_thread) { |
pending_dowork_count_--; |
DCHECK_GE(pending_dowork_count_, 0); |
@@ -598,6 +601,11 @@ void TaskQueueManager::DoWork(bool posted_from_main_thread) { |
MaybePostDoWorkOnMainRunner(); |
ProcessTaskFromWorkQueue(queue_index, i > 0, &previous_task); |
+ // Detect if the TaskQueueManager got deleted during the |
Sami
2015/04/08 14:24:04
This should probably be moved to within ProcessTas
alex clarke (OOO till 29th)
2015/04/08 14:33:05
Done.
|
+ // ProcessTaskFromWorkQueue call. |
+ if (protect->HasOneRef()) |
+ return; |
+ |
if (!UpdateWorkQueues(&previous_task)) |
return; |
} |