1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/post_task.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <utility>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/task_scheduler.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/threading/post_task_and_reply_impl.h"
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Worker namespace base {
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker namespace {
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Worker class PostTaskAndReplyWithTraitsTaskRunner
19*635a8641SAndroid Build Coastguard Worker : public internal::PostTaskAndReplyImpl {
20*635a8641SAndroid Build Coastguard Worker public:
PostTaskAndReplyWithTraitsTaskRunner(const TaskTraits & traits)21*635a8641SAndroid Build Coastguard Worker explicit PostTaskAndReplyWithTraitsTaskRunner(const TaskTraits& traits)
22*635a8641SAndroid Build Coastguard Worker : traits_(traits) {}
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Worker private:
PostTask(const Location & from_here,OnceClosure task)25*635a8641SAndroid Build Coastguard Worker bool PostTask(const Location& from_here, OnceClosure task) override {
26*635a8641SAndroid Build Coastguard Worker PostTaskWithTraits(from_here, traits_, std::move(task));
27*635a8641SAndroid Build Coastguard Worker return true;
28*635a8641SAndroid Build Coastguard Worker }
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker const TaskTraits traits_;
31*635a8641SAndroid Build Coastguard Worker };
32*635a8641SAndroid Build Coastguard Worker
33*635a8641SAndroid Build Coastguard Worker // Returns TaskTraits based on |traits|. If TaskPriority hasn't been set
34*635a8641SAndroid Build Coastguard Worker // explicitly in |traits|, the returned TaskTraits have the current
35*635a8641SAndroid Build Coastguard Worker // TaskPriority.
GetTaskTraitsWithExplicitPriority(const TaskTraits & traits)36*635a8641SAndroid Build Coastguard Worker TaskTraits GetTaskTraitsWithExplicitPriority(const TaskTraits& traits) {
37*635a8641SAndroid Build Coastguard Worker if (traits.priority_set_explicitly())
38*635a8641SAndroid Build Coastguard Worker return traits;
39*635a8641SAndroid Build Coastguard Worker return TaskTraits::Override(traits,
40*635a8641SAndroid Build Coastguard Worker {internal::GetTaskPriorityForCurrentThread()});
41*635a8641SAndroid Build Coastguard Worker }
42*635a8641SAndroid Build Coastguard Worker
43*635a8641SAndroid Build Coastguard Worker } // namespace
44*635a8641SAndroid Build Coastguard Worker
PostTask(const Location & from_here,OnceClosure task)45*635a8641SAndroid Build Coastguard Worker void PostTask(const Location& from_here, OnceClosure task) {
46*635a8641SAndroid Build Coastguard Worker PostDelayedTask(from_here, std::move(task), TimeDelta());
47*635a8641SAndroid Build Coastguard Worker }
48*635a8641SAndroid Build Coastguard Worker
PostDelayedTask(const Location & from_here,OnceClosure task,TimeDelta delay)49*635a8641SAndroid Build Coastguard Worker void PostDelayedTask(const Location& from_here,
50*635a8641SAndroid Build Coastguard Worker OnceClosure task,
51*635a8641SAndroid Build Coastguard Worker TimeDelta delay) {
52*635a8641SAndroid Build Coastguard Worker PostDelayedTaskWithTraits(from_here, TaskTraits(), std::move(task), delay);
53*635a8641SAndroid Build Coastguard Worker }
54*635a8641SAndroid Build Coastguard Worker
PostTaskAndReply(const Location & from_here,OnceClosure task,OnceClosure reply)55*635a8641SAndroid Build Coastguard Worker void PostTaskAndReply(const Location& from_here,
56*635a8641SAndroid Build Coastguard Worker OnceClosure task,
57*635a8641SAndroid Build Coastguard Worker OnceClosure reply) {
58*635a8641SAndroid Build Coastguard Worker PostTaskWithTraitsAndReply(from_here, TaskTraits(), std::move(task),
59*635a8641SAndroid Build Coastguard Worker std::move(reply));
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker
PostTaskWithTraits(const Location & from_here,const TaskTraits & traits,OnceClosure task)62*635a8641SAndroid Build Coastguard Worker void PostTaskWithTraits(const Location& from_here,
63*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
64*635a8641SAndroid Build Coastguard Worker OnceClosure task) {
65*635a8641SAndroid Build Coastguard Worker PostDelayedTaskWithTraits(from_here, traits, std::move(task), TimeDelta());
66*635a8641SAndroid Build Coastguard Worker }
67*635a8641SAndroid Build Coastguard Worker
PostDelayedTaskWithTraits(const Location & from_here,const TaskTraits & traits,OnceClosure task,TimeDelta delay)68*635a8641SAndroid Build Coastguard Worker void PostDelayedTaskWithTraits(const Location& from_here,
69*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
70*635a8641SAndroid Build Coastguard Worker OnceClosure task,
71*635a8641SAndroid Build Coastguard Worker TimeDelta delay) {
72*635a8641SAndroid Build Coastguard Worker DCHECK(TaskScheduler::GetInstance())
73*635a8641SAndroid Build Coastguard Worker << "Ref. Prerequisite section of post_task.h.\n\n"
74*635a8641SAndroid Build Coastguard Worker "Hint: if this is in a unit test, you're likely merely missing a "
75*635a8641SAndroid Build Coastguard Worker "base::test::ScopedTaskEnvironment member in your fixture.\n";
76*635a8641SAndroid Build Coastguard Worker TaskScheduler::GetInstance()->PostDelayedTaskWithTraits(
77*635a8641SAndroid Build Coastguard Worker from_here, GetTaskTraitsWithExplicitPriority(traits), std::move(task),
78*635a8641SAndroid Build Coastguard Worker std::move(delay));
79*635a8641SAndroid Build Coastguard Worker }
80*635a8641SAndroid Build Coastguard Worker
PostTaskWithTraitsAndReply(const Location & from_here,const TaskTraits & traits,OnceClosure task,OnceClosure reply)81*635a8641SAndroid Build Coastguard Worker void PostTaskWithTraitsAndReply(const Location& from_here,
82*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
83*635a8641SAndroid Build Coastguard Worker OnceClosure task,
84*635a8641SAndroid Build Coastguard Worker OnceClosure reply) {
85*635a8641SAndroid Build Coastguard Worker PostTaskAndReplyWithTraitsTaskRunner(traits).PostTaskAndReply(
86*635a8641SAndroid Build Coastguard Worker from_here, std::move(task), std::move(reply));
87*635a8641SAndroid Build Coastguard Worker }
88*635a8641SAndroid Build Coastguard Worker
CreateTaskRunnerWithTraits(const TaskTraits & traits)89*635a8641SAndroid Build Coastguard Worker scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(const TaskTraits& traits) {
90*635a8641SAndroid Build Coastguard Worker DCHECK(TaskScheduler::GetInstance())
91*635a8641SAndroid Build Coastguard Worker << "Ref. Prerequisite section of post_task.h.\n\n"
92*635a8641SAndroid Build Coastguard Worker "Hint: if this is in a unit test, you're likely merely missing a "
93*635a8641SAndroid Build Coastguard Worker "base::test::ScopedTaskEnvironment member in your fixture.\n";
94*635a8641SAndroid Build Coastguard Worker return TaskScheduler::GetInstance()->CreateTaskRunnerWithTraits(
95*635a8641SAndroid Build Coastguard Worker GetTaskTraitsWithExplicitPriority(traits));
96*635a8641SAndroid Build Coastguard Worker }
97*635a8641SAndroid Build Coastguard Worker
CreateSequencedTaskRunnerWithTraits(const TaskTraits & traits)98*635a8641SAndroid Build Coastguard Worker scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits(
99*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits) {
100*635a8641SAndroid Build Coastguard Worker DCHECK(TaskScheduler::GetInstance())
101*635a8641SAndroid Build Coastguard Worker << "Ref. Prerequisite section of post_task.h.\n\n"
102*635a8641SAndroid Build Coastguard Worker "Hint: if this is in a unit test, you're likely merely missing a "
103*635a8641SAndroid Build Coastguard Worker "base::test::ScopedTaskEnvironment member in your fixture.\n";
104*635a8641SAndroid Build Coastguard Worker return TaskScheduler::GetInstance()->CreateSequencedTaskRunnerWithTraits(
105*635a8641SAndroid Build Coastguard Worker GetTaskTraitsWithExplicitPriority(traits));
106*635a8641SAndroid Build Coastguard Worker }
107*635a8641SAndroid Build Coastguard Worker
CreateSingleThreadTaskRunnerWithTraits(const TaskTraits & traits,SingleThreadTaskRunnerThreadMode thread_mode)108*635a8641SAndroid Build Coastguard Worker scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits(
109*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
110*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode thread_mode) {
111*635a8641SAndroid Build Coastguard Worker DCHECK(TaskScheduler::GetInstance())
112*635a8641SAndroid Build Coastguard Worker << "Ref. Prerequisite section of post_task.h.\n\n"
113*635a8641SAndroid Build Coastguard Worker "Hint: if this is in a unit test, you're likely merely missing a "
114*635a8641SAndroid Build Coastguard Worker "base::test::ScopedTaskEnvironment member in your fixture.\n";
115*635a8641SAndroid Build Coastguard Worker return TaskScheduler::GetInstance()->CreateSingleThreadTaskRunnerWithTraits(
116*635a8641SAndroid Build Coastguard Worker GetTaskTraitsWithExplicitPriority(traits), thread_mode);
117*635a8641SAndroid Build Coastguard Worker }
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
CreateCOMSTATaskRunnerWithTraits(const TaskTraits & traits,SingleThreadTaskRunnerThreadMode thread_mode)120*635a8641SAndroid Build Coastguard Worker scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits(
121*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
122*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode thread_mode) {
123*635a8641SAndroid Build Coastguard Worker DCHECK(TaskScheduler::GetInstance())
124*635a8641SAndroid Build Coastguard Worker << "Ref. Prerequisite section of post_task.h.\n\n"
125*635a8641SAndroid Build Coastguard Worker "Hint: if this is in a unit test, you're likely merely missing a "
126*635a8641SAndroid Build Coastguard Worker "base::test::ScopedTaskEnvironment member in your fixture.\n";
127*635a8641SAndroid Build Coastguard Worker return TaskScheduler::GetInstance()->CreateCOMSTATaskRunnerWithTraits(
128*635a8641SAndroid Build Coastguard Worker GetTaskTraitsWithExplicitPriority(traits), thread_mode);
129*635a8641SAndroid Build Coastguard Worker }
130*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_WIN)
131*635a8641SAndroid Build Coastguard Worker
132*635a8641SAndroid Build Coastguard Worker } // namespace base
133