diff options
Diffstat (limited to 'chromium/base/task/sequence_manager/sequence_manager_impl.cc')
-rw-r--r-- | chromium/base/task/sequence_manager/sequence_manager_impl.cc | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/chromium/base/task/sequence_manager/sequence_manager_impl.cc b/chromium/base/task/sequence_manager/sequence_manager_impl.cc index 26977d6687b..7eea742aeb2 100644 --- a/chromium/base/task/sequence_manager/sequence_manager_impl.cc +++ b/chromium/base/task/sequence_manager/sequence_manager_impl.cc @@ -320,6 +320,16 @@ void SequenceManagerImpl::BindToCurrentThread( BindToMessagePump(std::move(pump)); } +scoped_refptr<SequencedTaskRunner> +SequenceManagerImpl::GetTaskRunnerForCurrentTask() { + DCHECK_CALLED_ON_VALID_THREAD(associated_thread_->thread_checker); + if (main_thread_only().task_execution_stack.empty()) + return nullptr; + return main_thread_only() + .task_execution_stack.back() + .pending_task.task_runner; +} + void SequenceManagerImpl::CompleteInitializationOnBoundThread() { controller_->AddNestingObserver(this); main_thread_only().nesting_observer_registered_ = true; @@ -488,10 +498,10 @@ const char* RunTaskTraceNameForPriority(TaskQueue::QueuePriority priority) { } // namespace -Optional<Task> SequenceManagerImpl::TakeTask() { - Optional<Task> task = TakeTaskImpl(); +Task* SequenceManagerImpl::SelectNextTask() { + Task* task = SelectNextTaskImpl(); if (!task) - return base::nullopt; + return nullptr; ExecutingTask& executing_task = *main_thread_only().task_execution_stack.rbegin(); @@ -503,62 +513,70 @@ Optional<Task> SequenceManagerImpl::TakeTask() { "task_type", executing_task.task_type); TRACE_EVENT_BEGIN0("sequence_manager", executing_task.task_queue_name); -#if DCHECK_IS_ON() && !defined(OS_NACL) - LogTaskDebugInfo(executing_task); -#endif - return task; } #if DCHECK_IS_ON() && !defined(OS_NACL) void SequenceManagerImpl::LogTaskDebugInfo( - const ExecutingTask& executing_task) { + const WorkQueue* selected_work_queue) const { + const Task* task = selected_work_queue->GetFrontTask(); switch (settings_.task_execution_logging) { case Settings::TaskLogging::kNone: break; case Settings::TaskLogging::kEnabled: - LOG(INFO) << "#" - << static_cast<uint64_t>( - executing_task.pending_task.enqueue_order()) - << " " << executing_task.task_queue_name - << (executing_task.pending_task.cross_thread_ - ? " Run crossthread " - : " Run ") - << executing_task.pending_task.posted_from.ToString(); + LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " " + << selected_work_queue->task_queue()->GetName() + << (task->cross_thread_ ? " Run crossthread " : " Run ") + << task->posted_from.ToString(); break; case Settings::TaskLogging::kEnabledWithBacktrace: { std::array<const void*, PendingTask::kTaskBacktraceLength + 1> task_trace; - task_trace[0] = executing_task.pending_task.posted_from.program_counter(); - std::copy(executing_task.pending_task.task_backtrace.begin(), - executing_task.pending_task.task_backtrace.end(), + task_trace[0] = task->posted_from.program_counter(); + std::copy(task->task_backtrace.begin(), task->task_backtrace.end(), task_trace.begin() + 1); size_t length = 0; while (length < task_trace.size() && task_trace[length]) ++length; if (length == 0) break; - LOG(INFO) << "#" - << static_cast<uint64_t>( - executing_task.pending_task.enqueue_order()) - << " " << executing_task.task_queue_name - << (executing_task.pending_task.cross_thread_ - ? " Run crossthread " - : " Run ") + LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " " + << selected_work_queue->task_queue()->GetName() + << (task->cross_thread_ ? " Run crossthread " : " Run ") << debug::StackTrace(task_trace.data(), length); break; } + + case Settings::TaskLogging::kReorderedOnly: { + std::vector<const Task*> skipped_tasks; + main_thread_only().selector.CollectSkippedOverLowerPriorityTasks( + selected_work_queue, &skipped_tasks); + + if (skipped_tasks.empty()) + break; + + LOG(INFO) << "#" << static_cast<uint64_t>(task->enqueue_order()) << " " + << selected_work_queue->task_queue()->GetName() + << (task->cross_thread_ ? " Run crossthread " : " Run ") + << task->posted_from.ToString(); + + for (const Task* skipped_task : skipped_tasks) { + LOG(INFO) << "# (skipped over) " + << static_cast<uint64_t>(skipped_task->enqueue_order()) << " " + << skipped_task->posted_from.ToString(); + } + } } } #endif // DCHECK_IS_ON() && !defined(OS_NACL) -Optional<Task> SequenceManagerImpl::TakeTaskImpl() { +Task* SequenceManagerImpl::SelectNextTaskImpl() { CHECK(Validate()); DCHECK_CALLED_ON_VALID_THREAD(associated_thread_->thread_checker); TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("sequence_manager"), - "SequenceManagerImpl::TakeTask"); + "SequenceManagerImpl::SelectNextTask"); ReloadEmptyWorkQueues(); LazyNow lazy_now(controller_->GetClock()); @@ -579,7 +597,7 @@ Optional<Task> SequenceManagerImpl::TakeTaskImpl() { this, AsValueWithSelectorResult(work_queue, /* force_verbose */ false)); if (!work_queue) - return nullopt; + return nullptr; // If the head task was canceled, remove it and run the selector again. if (UNLIKELY(work_queue->RemoveAllCanceledTasksFromFront())) @@ -604,9 +622,13 @@ Optional<Task> SequenceManagerImpl::TakeTaskImpl() { work_queue->task_queue()->GetQueuePriority()))) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("sequence_manager"), "SequenceManager.YieldToNative"); - return nullopt; + return nullptr; } +#if DCHECK_IS_ON() && !defined(OS_NACL) + LogTaskDebugInfo(work_queue); +#endif // DCHECK_IS_ON() && !defined(OS_NACL) + main_thread_only().task_execution_stack.emplace_back( work_queue->TakeTaskFromWorkQueue(), work_queue->task_queue(), InitializeTaskTiming(work_queue->task_queue())); @@ -615,7 +637,7 @@ Optional<Task> SequenceManagerImpl::TakeTaskImpl() { *main_thread_only().task_execution_stack.rbegin(); NotifyWillProcessTask(&executing_task, &lazy_now); - return std::move(executing_task.pending_task); + return &executing_task.pending_task; } } |