xref: /aosp_15_r20/external/libchrome/base/task_scheduler/post_task.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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