| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/task_scheduler/post_task.h" |
| |
| #include <utility> |
| |
| #include "base/logging.h" |
| #include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h" |
| #include "base/task_scheduler/task_scheduler.h" |
| #include "base/threading/post_task_and_reply_impl.h" |
| |
| namespace base { |
| |
| namespace { |
| |
| class PostTaskAndReplyWithTraitsTaskRunner |
| : public internal::PostTaskAndReplyImpl { |
| public: |
| explicit PostTaskAndReplyWithTraitsTaskRunner(const TaskTraits& traits) |
| : traits_(traits) {} |
| |
| private: |
| bool PostTask(const Location& from_here, OnceClosure task) override { |
| PostTaskWithTraits(from_here, traits_, std::move(task)); |
| return true; |
| } |
| |
| const TaskTraits traits_; |
| }; |
| |
| // Returns TaskTraits based on |traits|. If TaskPriority hasn't been set |
| // explicitly in |traits|, the returned TaskTraits have the current |
| // TaskPriority. |
| TaskTraits GetTaskTraitsWithExplicitPriority(const TaskTraits& traits) { |
| if (traits.priority_set_explicitly()) |
| return traits; |
| return TaskTraits::Override(traits, |
| {internal::GetTaskPriorityForCurrentThread()}); |
| } |
| |
| } // namespace |
| |
| void PostTask(const Location& from_here, OnceClosure task) { |
| PostDelayedTask(from_here, std::move(task), TimeDelta()); |
| } |
| |
| void PostDelayedTask(const Location& from_here, |
| OnceClosure task, |
| TimeDelta delay) { |
| PostDelayedTaskWithTraits(from_here, TaskTraits(), std::move(task), delay); |
| } |
| |
| void PostTaskAndReply(const Location& from_here, |
| OnceClosure task, |
| OnceClosure reply) { |
| PostTaskWithTraitsAndReply(from_here, TaskTraits(), std::move(task), |
| std::move(reply)); |
| } |
| |
| void PostTaskWithTraits(const Location& from_here, |
| const TaskTraits& traits, |
| OnceClosure task) { |
| PostDelayedTaskWithTraits(from_here, traits, std::move(task), TimeDelta()); |
| } |
| |
| void PostDelayedTaskWithTraits(const Location& from_here, |
| const TaskTraits& traits, |
| OnceClosure task, |
| TimeDelta delay) { |
| DCHECK(TaskScheduler::GetInstance()) |
| << "Ref. Prerequisite section of post_task.h.\n\n" |
| "Hint: if this is in a unit test, you're likely merely missing a " |
| "base::test::ScopedTaskEnvironment member in your fixture.\n"; |
| TaskScheduler::GetInstance()->PostDelayedTaskWithTraits( |
| from_here, GetTaskTraitsWithExplicitPriority(traits), std::move(task), |
| std::move(delay)); |
| } |
| |
| void PostTaskWithTraitsAndReply(const Location& from_here, |
| const TaskTraits& traits, |
| OnceClosure task, |
| OnceClosure reply) { |
| PostTaskAndReplyWithTraitsTaskRunner(traits).PostTaskAndReply( |
| from_here, std::move(task), std::move(reply)); |
| } |
| |
| scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(const TaskTraits& traits) { |
| DCHECK(TaskScheduler::GetInstance()) |
| << "Ref. Prerequisite section of post_task.h.\n\n" |
| "Hint: if this is in a unit test, you're likely merely missing a " |
| "base::test::ScopedTaskEnvironment member in your fixture.\n"; |
| return TaskScheduler::GetInstance()->CreateTaskRunnerWithTraits( |
| GetTaskTraitsWithExplicitPriority(traits)); |
| } |
| |
| scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( |
| const TaskTraits& traits) { |
| DCHECK(TaskScheduler::GetInstance()) |
| << "Ref. Prerequisite section of post_task.h.\n\n" |
| "Hint: if this is in a unit test, you're likely merely missing a " |
| "base::test::ScopedTaskEnvironment member in your fixture.\n"; |
| return TaskScheduler::GetInstance()->CreateSequencedTaskRunnerWithTraits( |
| GetTaskTraitsWithExplicitPriority(traits)); |
| } |
| |
| scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits( |
| const TaskTraits& traits, |
| SingleThreadTaskRunnerThreadMode thread_mode) { |
| DCHECK(TaskScheduler::GetInstance()) |
| << "Ref. Prerequisite section of post_task.h.\n\n" |
| "Hint: if this is in a unit test, you're likely merely missing a " |
| "base::test::ScopedTaskEnvironment member in your fixture.\n"; |
| return TaskScheduler::GetInstance()->CreateSingleThreadTaskRunnerWithTraits( |
| GetTaskTraitsWithExplicitPriority(traits), thread_mode); |
| } |
| |
| #if defined(OS_WIN) |
| scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits( |
| const TaskTraits& traits, |
| SingleThreadTaskRunnerThreadMode thread_mode) { |
| DCHECK(TaskScheduler::GetInstance()) |
| << "Ref. Prerequisite section of post_task.h.\n\n" |
| "Hint: if this is in a unit test, you're likely merely missing a " |
| "base::test::ScopedTaskEnvironment member in your fixture.\n"; |
| return TaskScheduler::GetInstance()->CreateCOMSTATaskRunnerWithTraits( |
| GetTaskTraitsWithExplicitPriority(traits), thread_mode); |
| } |
| #endif // defined(OS_WIN) |
| |
| } // namespace base |