| Index: base/message_loop/message_loop.cc
|
| diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
|
| index 72185a8e11a3d085d43af4b131f26cbd87a09490..f48a8dcd9fee751b042bc63e8040441a70ec8743 100644
|
| --- a/base/message_loop/message_loop.cc
|
| +++ b/base/message_loop/message_loop.cc
|
| @@ -390,15 +390,26 @@ bool MessageLoop::ProcessNextDelayedNonNestableTask() {
|
| if (run_loop_->run_depth_ != 1)
|
| return false;
|
|
|
| - if (deferred_non_nestable_work_queue_.empty())
|
| - return false;
|
| + while (!deferred_non_nestable_work_queue_.empty()) {
|
| + PendingTask pending_task =
|
| + std::move(deferred_non_nestable_work_queue_.front());
|
| + deferred_non_nestable_work_queue_.pop();
|
|
|
| - PendingTask pending_task =
|
| - std::move(deferred_non_nestable_work_queue_.front());
|
| - deferred_non_nestable_work_queue_.pop();
|
| + if (pending_task.task.IsCancelled()) {
|
| +#if defined(OS_WIN)
|
| + if (pending_task.is_high_res) {
|
| + pending_high_res_tasks_--;
|
| + CHECK_GE(pending_high_res_tasks_, 0);
|
| + }
|
| +#endif
|
| + continue;
|
| + }
|
|
|
| - RunTask(&pending_task);
|
| - return true;
|
| + RunTask(&pending_task);
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| void MessageLoop::RunTask(PendingTask* pending_task) {
|
| @@ -444,6 +455,28 @@ void MessageLoop::AddToDelayedWorkQueue(PendingTask pending_task) {
|
| delayed_work_queue_.push(std::move(pending_task));
|
| }
|
|
|
| +bool MessageLoop::SweepDelayedWorkQueue() {
|
| + DCHECK(!delayed_work_queue_.empty());
|
| +
|
| + do {
|
| + const auto& pending_task = delayed_work_queue_.top();
|
| + if (pending_task.task.IsCancelled()) {
|
| +#if defined(OS_WIN)
|
| + if (pending_task.is_high_res) {
|
| + pending_high_res_tasks_--;
|
| + CHECK_GE(pending_high_res_tasks_, 0);
|
| + }
|
| +#endif
|
| + delayed_work_queue_.pop();
|
| + continue;
|
| + } else {
|
| + return false;
|
| + }
|
| + } while (!delayed_work_queue_.empty());
|
| +
|
| + return true;
|
| +}
|
| +
|
| bool MessageLoop::DeletePendingTasks() {
|
| bool did_work = !work_queue_.empty();
|
| while (!work_queue_.empty()) {
|
| @@ -512,6 +545,17 @@ bool MessageLoop::DoWork() {
|
| do {
|
| PendingTask pending_task = std::move(work_queue_.front());
|
| work_queue_.pop();
|
| +
|
| + if (pending_task.task.IsCancelled()) {
|
| +#if defined(OS_WIN)
|
| + if (pending_task.is_high_res) {
|
| + pending_high_res_tasks_--;
|
| + CHECK_GE(pending_high_res_tasks_, 0);
|
| + }
|
| +#endif
|
| + continue;
|
| + }
|
| +
|
| if (!pending_task.delayed_run_time.is_null()) {
|
| int sequence_num = pending_task.sequence_num;
|
| TimeTicks delayed_run_time = pending_task.delayed_run_time;
|
| @@ -531,7 +575,8 @@ bool MessageLoop::DoWork() {
|
| }
|
|
|
| bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
|
| - if (!nestable_tasks_allowed_ || delayed_work_queue_.empty()) {
|
| + if (!nestable_tasks_allowed_ || delayed_work_queue_.empty() ||
|
| + SweepDelayedWorkQueue()) {
|
| recent_time_ = *next_delayed_work_time = TimeTicks();
|
| return false;
|
| }
|
| @@ -556,10 +601,12 @@ bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
|
| std::move(const_cast<PendingTask&>(delayed_work_queue_.top()));
|
| delayed_work_queue_.pop();
|
|
|
| - if (!delayed_work_queue_.empty())
|
| + bool did_work = DeferOrRunPendingTask(std::move(pending_task));
|
| +
|
| + if (!delayed_work_queue_.empty() && !SweepDelayedWorkQueue())
|
| *next_delayed_work_time = delayed_work_queue_.top().delayed_run_time;
|
|
|
| - return DeferOrRunPendingTask(std::move(pending_task));
|
| + return did_work;
|
| }
|
|
|
| bool MessageLoop::DoIdleWork() {
|
|
|