| Index: base/message_loop/incoming_task_queue.cc
|
| diff --git a/base/message_loop/incoming_task_queue.cc b/base/message_loop/incoming_task_queue.cc
|
| index c1ce939b0c4708ac431d80b54a35ee8ef73b314c..2e55fd6d33088b2e1b6e8e47207b90804e2447da 100644
|
| --- a/base/message_loop/incoming_task_queue.cc
|
| +++ b/base/message_loop/incoming_task_queue.cc
|
| @@ -39,12 +39,21 @@ bool AlwaysNotifyPump(MessageLoop::Type type) {
|
|
|
| } // namespace
|
|
|
| -IncomingTaskQueue::IncomingTaskQueue(MessageLoop* message_loop)
|
| +IncomingTaskQueue::IncomingTaskQueue()
|
| : high_res_task_count_(0),
|
| - message_loop_(message_loop),
|
| - next_sequence_num_(0),
|
| - message_loop_scheduled_(false),
|
| - always_schedule_work_(AlwaysNotifyPump(message_loop_->type())) {
|
| + message_loop_(nullptr),
|
| + next_sequence_num_(0) {
|
| +}
|
| +
|
| +void IncomingTaskQueue::StartScheduling(MessageLoop* message_loop) {
|
| + AutoLock lock(incoming_queue_lock_);
|
| + DCHECK(!message_loop_);
|
| + DCHECK(!message_loop_terminated_);
|
| + DCHECK(message_loop);
|
| + message_loop_ = message_loop;
|
| + always_schedule_work_ = AlwaysNotifyPump(message_loop_->type());
|
| + if (!incoming_queue_.empty())
|
| + message_loop_->ScheduleWork();
|
| }
|
|
|
| bool IncomingTaskQueue::AddToIncomingQueue(
|
| @@ -107,11 +116,13 @@ int IncomingTaskQueue::ReloadWorkQueue(TaskQueue* work_queue) {
|
| void IncomingTaskQueue::WillDestroyCurrentMessageLoop() {
|
| AutoLock lock(incoming_queue_lock_);
|
| message_loop_ = NULL;
|
| + message_loop_terminated_ = true;
|
| }
|
|
|
| IncomingTaskQueue::~IncomingTaskQueue() {
|
| // Verify that WillDestroyCurrentMessageLoop() has been called.
|
| DCHECK(!message_loop_);
|
| + DCHECK(message_loop_terminated_);
|
| }
|
|
|
| TimeTicks IncomingTaskQueue::CalculateDelayedRuntime(TimeDelta delay) {
|
| @@ -131,7 +142,7 @@ bool IncomingTaskQueue::PostPendingTask(PendingTask* pending_task) {
|
| // This should only be called while the lock is taken.
|
| incoming_queue_lock_.AssertAcquired();
|
|
|
| - if (!message_loop_) {
|
| + if (message_loop_terminated_) {
|
| pending_task->task.Reset();
|
| return false;
|
| }
|
| @@ -141,14 +152,14 @@ bool IncomingTaskQueue::PostPendingTask(PendingTask* pending_task) {
|
| // delayed_run_time value) and for identifying the task in about:tracing.
|
| pending_task->sequence_num = next_sequence_num_++;
|
|
|
| - message_loop_->task_annotator()->DidQueueTask("MessageLoop::PostTask",
|
| - *pending_task);
|
| + task_annotator_.DidQueueTask("MessageLoop::PostTask", *pending_task);
|
|
|
| bool was_empty = incoming_queue_.empty();
|
| incoming_queue_.push(*pending_task);
|
| pending_task->task.Reset();
|
|
|
| - if (always_schedule_work_ || (!message_loop_scheduled_ && was_empty)) {
|
| + if (message_loop_ &&
|
| + (always_schedule_work_ || (!message_loop_scheduled_ && was_empty))) {
|
| // Wake up the message loop.
|
| message_loop_->ScheduleWork();
|
| // After we've scheduled the message loop, we do not need to do so again
|
|
|