| Index: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
|
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
|
| index 6a35acc7b8bdf2304e2cc9a4bb1810f449c15460..f44ee457a87e5189ddb438b495d6db1920f95be9 100644
|
| --- a/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
|
| +++ b/third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc
|
| @@ -131,10 +131,7 @@ void TaskQueueManager::UnregisterTaskQueue(
|
| selector_.RemoveQueue(task_queue.get());
|
| }
|
|
|
| -void TaskQueueManager::UpdateWorkQueues(
|
| - bool should_trigger_wakeup,
|
| - const internal::TaskQueueImpl::Task* previous_task,
|
| - LazyNow lazy_now) {
|
| +void TaskQueueManager::UpdateWorkQueues(LazyNow lazy_now) {
|
| TRACE_EVENT0(disabled_by_default_tracing_category_,
|
| "TaskQueueManager::UpdateWorkQueues");
|
|
|
| @@ -142,8 +139,7 @@ void TaskQueueManager::UpdateWorkQueues(
|
| LazyNow lazy_now_in_domain = time_domain == real_time_domain_.get()
|
| ? lazy_now
|
| : time_domain->CreateLazyNow();
|
| - time_domain->UpdateWorkQueues(should_trigger_wakeup, previous_task,
|
| - lazy_now_in_domain);
|
| + time_domain->UpdateWorkQueues(lazy_now_in_domain);
|
| }
|
| }
|
|
|
| @@ -194,6 +190,11 @@ void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) {
|
| other_thread_pending_wakeups_.erase(run_time);
|
| }
|
|
|
| + // TODO(alexclarke): Add a base::RunLoop observer and prevent
|
| + // MaybeScheduleImmediateWork posting MaybeScheduleImmediateWork while DoWork
|
| + // is running. We'll need to post a DoWork on entering and leaving a nested
|
| + // run loop.
|
| +
|
| if (!delegate_->IsNested())
|
| queues_to_delete_.clear();
|
|
|
| @@ -203,26 +204,17 @@ void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) {
|
| if (!delegate_->IsNested() && task_time_observers_.might_have_observers())
|
| task_start_time = lazy_now.Now();
|
|
|
| - // Pass false and nullptr to UpdateWorkQueues here to prevent waking up a
|
| - // pump-after-wakeup queue.
|
| - UpdateWorkQueues(false, nullptr, lazy_now);
|
| -
|
| - internal::TaskQueueImpl::Task previous_task;
|
| + // TODO(alexclarke): Get rid of this and call once per loop iteration.
|
| + UpdateWorkQueues(lazy_now);
|
|
|
| for (int i = 0; i < work_batch_size_; i++) {
|
| internal::WorkQueue* work_queue;
|
| - if (!SelectWorkQueueToService(&work_queue)) {
|
| + if (!SelectWorkQueueToService(&work_queue))
|
| break;
|
| - }
|
| -
|
| - bool should_trigger_wakeup = work_queue->task_queue()->wakeup_policy() ==
|
| - TaskQueue::WakeupPolicy::CAN_WAKE_OTHER_QUEUES;
|
|
|
| - switch (ProcessTaskFromWorkQueue(work_queue, &previous_task)) {
|
| + switch (ProcessTaskFromWorkQueue(work_queue)) {
|
| case ProcessTaskResult::DEFERRED:
|
| - // If a task was deferred, try again with another task. Note that this
|
| - // means deferred tasks (i.e. non-nestable tasks) will never trigger
|
| - // queue wake-ups.
|
| + // If a task was deferred, try again with another task.
|
| continue;
|
| case ProcessTaskResult::EXECUTED:
|
| break;
|
| @@ -242,7 +234,7 @@ void TaskQueueManager::DoWork(base::TimeTicks run_time, bool from_main_thread) {
|
|
|
| work_queue = nullptr; // The queue may have been unregistered.
|
|
|
| - UpdateWorkQueues(should_trigger_wakeup, &previous_task, lazy_now);
|
| + UpdateWorkQueues(lazy_now);
|
|
|
| // Only run a single task per batch in nested run loops so that we can
|
| // properly exit the nested loop when someone calls RunLoop::Quit().
|
| @@ -280,8 +272,7 @@ void TaskQueueManager::DidQueueTask(
|
| }
|
|
|
| TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue(
|
| - internal::WorkQueue* work_queue,
|
| - internal::TaskQueueImpl::Task* out_previous_task) {
|
| + internal::WorkQueue* work_queue) {
|
| DCHECK(main_thread_checker_.CalledOnValidThread());
|
| scoped_refptr<DeletionSentinel> protect(deletion_sentinel_);
|
| internal::TaskQueueImpl* queue = work_queue->task_queue();
|
| @@ -318,7 +309,6 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue(
|
| currently_executing_task_queue_;
|
| currently_executing_task_queue_ = queue;
|
| task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task);
|
| -
|
| // Detect if the TaskQueueManager just got deleted. If this happens we must
|
| // not access any member variables after this point.
|
| if (protect->HasOneRef())
|
| @@ -332,8 +322,6 @@ TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue(
|
| queue->NotifyDidProcessTask(pending_task);
|
| }
|
|
|
| - pending_task.task.Reset();
|
| - *out_previous_task = std::move(pending_task);
|
| return ProcessTaskResult::EXECUTED;
|
| }
|
|
|
| @@ -343,17 +331,13 @@ void TaskQueueManager::MaybeRecordTaskDelayHistograms(
|
| if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0)
|
| return;
|
|
|
| - // Record delayed task lateness and immediate task queueing durations, but
|
| - // only for auto-pumped queues. Manually pumped and after wakeup queues can
|
| - // have arbitarially large delayes, which would cloud any analysis.
|
| - if (queue->GetPumpPolicy() == TaskQueue::PumpPolicy::AUTO) {
|
| - if (!pending_task.delayed_run_time.is_null()) {
|
| - RecordDelayedTaskLateness(delegate_->NowTicks() -
|
| - pending_task.delayed_run_time);
|
| - } else if (!pending_task.time_posted.is_null()) {
|
| - RecordImmediateTaskQueueingDuration(tracked_objects::TrackedTime::Now() -
|
| - pending_task.time_posted);
|
| - }
|
| + // Record delayed task lateness and immediate task queuing durations.
|
| + if (!pending_task.delayed_run_time.is_null()) {
|
| + RecordDelayedTaskLateness(delegate_->NowTicks() -
|
| + pending_task.delayed_run_time);
|
| + } else if (!pending_task.time_posted.is_null()) {
|
| + RecordImmediateTaskQueueingDuration(tracked_objects::TrackedTime::Now() -
|
| + pending_task.time_posted);
|
| }
|
| }
|
|
|
| @@ -439,10 +423,8 @@ TaskQueueManager::AsValueWithSelectorResult(
|
| void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) {
|
| DCHECK(main_thread_checker_.CalledOnValidThread());
|
| // Only schedule DoWork if there's something to do.
|
| - if (!queue->immediate_work_queue()->Empty() ||
|
| - !queue->delayed_work_queue()->Empty()) {
|
| + if (queue->HasPendingImmediateWork())
|
| MaybeScheduleImmediateWork(FROM_HERE);
|
| - }
|
| }
|
|
|
| void TaskQueueManager::OnTriedToSelectBlockedWorkQueue(
|
|
|