summaryrefslogtreecommitdiffstats
path: root/chromium/base/task/sequence_manager/sequence_manager_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/base/task/sequence_manager/sequence_manager_impl.cc')
-rw-r--r--chromium/base/task/sequence_manager/sequence_manager_impl.cc84
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;
}
}