Index: base/task_scheduler/task_tracker.cc |
diff --git a/base/task_scheduler/task_tracker.cc b/base/task_scheduler/task_tracker.cc |
index ba12beb32cfef638eebc49b2b6900d84eddc71e2..55230aa93742ee3c58da9d43a2a67dc72d452cd8 100644 |
--- a/base/task_scheduler/task_tracker.cc |
+++ b/base/task_scheduler/task_tracker.cc |
@@ -246,57 +246,7 @@ bool TaskTracker::RunTask(std::unique_ptr<Task> task, |
const bool is_delayed = !task->delayed_run_time.is_null(); |
if (can_run_task) { |
- RecordTaskLatencyHistogram(task.get()); |
- |
- const bool previous_singleton_allowed = |
- ThreadRestrictions::SetSingletonAllowed( |
- task->traits.shutdown_behavior() != |
- TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN); |
- const bool previous_io_allowed = |
- ThreadRestrictions::SetIOAllowed(task->traits.may_block()); |
- const bool previous_wait_allowed = ThreadRestrictions::SetWaitAllowed( |
- task->traits.with_base_sync_primitives()); |
- |
- { |
- ScopedSetSequenceTokenForCurrentThread |
- scoped_set_sequence_token_for_current_thread(sequence_token); |
- ScopedSetTaskPriorityForCurrentThread |
- scoped_set_task_priority_for_current_thread(task->traits.priority()); |
- |
- // Set up TaskRunnerHandle as expected for the scope of the task. |
- std::unique_ptr<SequencedTaskRunnerHandle> sequenced_task_runner_handle; |
- std::unique_ptr<ThreadTaskRunnerHandle> single_thread_task_runner_handle; |
- DCHECK(!task->sequenced_task_runner_ref || |
- !task->single_thread_task_runner_ref); |
- if (task->sequenced_task_runner_ref) { |
- sequenced_task_runner_handle.reset( |
- new SequencedTaskRunnerHandle(task->sequenced_task_runner_ref)); |
- } else if (task->single_thread_task_runner_ref) { |
- single_thread_task_runner_handle.reset( |
- new ThreadTaskRunnerHandle(task->single_thread_task_runner_ref)); |
- } |
- |
- TRACE_TASK_EXECUTION(kRunFunctionName, *task); |
- |
- const char* const execution_mode = |
- task->single_thread_task_runner_ref |
- ? kSingleThreadExecutionMode |
- : (task->sequenced_task_runner_ref ? kSequencedExecutionMode |
- : kParallelExecutionMode); |
- // TODO(gab): In a better world this would be tacked on as an extra arg |
- // to the trace event generated above. This is not possible however until |
- // http://crbug.com/652692 is resolved. |
- TRACE_EVENT1("task_scheduler", "TaskTracker::RunTask", "task_info", |
- MakeUnique<TaskTracingInfo>(task->traits, execution_mode, |
- sequence_token)); |
- |
- PerformRunTask(std::move(task)); |
- } |
- |
- ThreadRestrictions::SetWaitAllowed(previous_wait_allowed); |
- ThreadRestrictions::SetIOAllowed(previous_io_allowed); |
- ThreadRestrictions::SetSingletonAllowed(previous_singleton_allowed); |
- |
+ PerformRunTask(std::move(task), sequence_token); |
AfterRunTask(shutdown_behavior); |
} |
@@ -327,8 +277,58 @@ void TaskTracker::SetHasShutdownStartedForTesting() { |
state_->StartShutdown(); |
} |
-void TaskTracker::PerformRunTask(std::unique_ptr<Task> task) { |
- debug::TaskAnnotator().RunTask(kQueueFunctionName, task.get()); |
+void TaskTracker::PerformRunTask(std::unique_ptr<Task> task, |
+ const SequenceToken& sequence_token) { |
+ RecordTaskLatencyHistogram(task.get()); |
+ |
+ const bool previous_singleton_allowed = |
+ ThreadRestrictions::SetSingletonAllowed( |
+ task->traits.shutdown_behavior() != |
+ TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN); |
+ const bool previous_io_allowed = |
+ ThreadRestrictions::SetIOAllowed(task->traits.may_block()); |
+ const bool previous_wait_allowed = ThreadRestrictions::SetWaitAllowed( |
+ task->traits.with_base_sync_primitives()); |
+ |
+ { |
+ ScopedSetSequenceTokenForCurrentThread |
+ scoped_set_sequence_token_for_current_thread(sequence_token); |
+ ScopedSetTaskPriorityForCurrentThread |
+ scoped_set_task_priority_for_current_thread(task->traits.priority()); |
+ |
+ // Set up TaskRunnerHandle as expected for the scope of the task. |
+ std::unique_ptr<SequencedTaskRunnerHandle> sequenced_task_runner_handle; |
+ std::unique_ptr<ThreadTaskRunnerHandle> single_thread_task_runner_handle; |
+ DCHECK(!task->sequenced_task_runner_ref || |
+ !task->single_thread_task_runner_ref); |
+ if (task->sequenced_task_runner_ref) { |
+ sequenced_task_runner_handle.reset( |
+ new SequencedTaskRunnerHandle(task->sequenced_task_runner_ref)); |
+ } else if (task->single_thread_task_runner_ref) { |
+ single_thread_task_runner_handle.reset( |
+ new ThreadTaskRunnerHandle(task->single_thread_task_runner_ref)); |
+ } |
+ |
+ TRACE_TASK_EXECUTION(kRunFunctionName, *task); |
+ |
+ const char* const execution_mode = |
+ task->single_thread_task_runner_ref |
+ ? kSingleThreadExecutionMode |
+ : (task->sequenced_task_runner_ref ? kSequencedExecutionMode |
+ : kParallelExecutionMode); |
+ // TODO(gab): In a better world this would be tacked on as an extra arg |
+ // to the trace event generated above. This is not possible however until |
+ // http://crbug.com/652692 is resolved. |
+ TRACE_EVENT1("task_scheduler", "TaskTracker::RunTask", "task_info", |
+ MakeUnique<TaskTracingInfo>(task->traits, execution_mode, |
+ sequence_token)); |
+ |
+ debug::TaskAnnotator().RunTask(kQueueFunctionName, task.get()); |
+ } |
+ |
+ ThreadRestrictions::SetWaitAllowed(previous_wait_allowed); |
+ ThreadRestrictions::SetIOAllowed(previous_io_allowed); |
+ ThreadRestrictions::SetSingletonAllowed(previous_singleton_allowed); |
} |
void TaskTracker::PerformShutdown() { |