xref: /aosp_15_r20/external/cronet/base/task/thread_pool.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/task/thread_pool.h"
6 
7 #include "base/check.h"
8 #include "base/task/scoped_set_task_priority_for_current_thread.h"
9 #include "base/task/task_traits.h"
10 #include "base/task/thread_pool/thread_pool_impl.h"
11 #include "base/task/thread_pool/thread_pool_instance.h"
12 #include "base/threading/post_task_and_reply_impl.h"
13 #include "build/build_config.h"
14 
15 namespace base {
16 
17 namespace {
18 
19 
GetThreadPoolImpl()20 internal::ThreadPoolImpl* GetThreadPoolImpl() {
21   auto* instance = ThreadPoolInstance::Get();
22   DCHECK(instance)
23       << "No threadpool instance for this process. See the 'Prerequisite' "
24          "section of base/task/thread_pool.h.\n"
25          "Hint: if this is in a unit test, you're likely merely missing a "
26          "base::test::TaskEnvironment member in your fixture (or your fixture "
27          "is using a base::test::SingleThreadTaskEnvironment and now needs a "
28          "full base::test::TaskEnvironment).\n";
29   return static_cast<internal::ThreadPoolImpl*>(instance);
30 }
31 
32 }  // namespace
33 
34 // static
PostTask(const Location & from_here,OnceClosure task)35 bool ThreadPool::PostTask(const Location& from_here, OnceClosure task) {
36   return ThreadPool::PostDelayedTask(from_here, std::move(task), TimeDelta());
37 }
38 
39 // static
PostDelayedTask(const Location & from_here,OnceClosure task,TimeDelta delay)40 bool ThreadPool::PostDelayedTask(const Location& from_here,
41                                  OnceClosure task,
42                                  TimeDelta delay) {
43   return ThreadPool::PostDelayedTask(from_here, {}, std::move(task), delay);
44 }
45 
46 // static
PostTaskAndReply(const Location & from_here,OnceClosure task,OnceClosure reply)47 bool ThreadPool::PostTaskAndReply(const Location& from_here,
48                                   OnceClosure task,
49                                   OnceClosure reply) {
50   return ThreadPool::PostTaskAndReply(from_here, {}, std::move(task),
51                                       std::move(reply));
52 }
53 
54 // static
PostTask(const Location & from_here,const TaskTraits & traits,OnceClosure task)55 bool ThreadPool::PostTask(const Location& from_here,
56                           const TaskTraits& traits,
57                           OnceClosure task) {
58   return ThreadPool::PostDelayedTask(from_here, traits, std::move(task),
59                                      TimeDelta());
60 }
61 
62 // static
PostDelayedTask(const Location & from_here,const TaskTraits & traits,OnceClosure task,TimeDelta delay)63 bool ThreadPool::PostDelayedTask(const Location& from_here,
64                                  const TaskTraits& traits,
65                                  OnceClosure task,
66                                  TimeDelta delay) {
67   return GetThreadPoolImpl()->PostDelayedTask(from_here, traits,
68                                               std::move(task), delay);
69 }
70 
71 // static
PostTaskAndReply(const Location & from_here,const TaskTraits & traits,OnceClosure task,OnceClosure reply)72 bool ThreadPool::PostTaskAndReply(const Location& from_here,
73                                   const TaskTraits& traits,
74                                   OnceClosure task,
75                                   OnceClosure reply) {
76   return internal::PostTaskAndReplyImpl(
77       [&traits](const Location& location, OnceClosure task) {
78         return ThreadPool::PostTask(location, traits, std::move(task));
79       },
80       from_here, std::move(task), std::move(reply));
81 }
82 
83 // static
CreateTaskRunner(const TaskTraits & traits)84 scoped_refptr<TaskRunner> ThreadPool::CreateTaskRunner(
85     const TaskTraits& traits) {
86   return GetThreadPoolImpl()->CreateTaskRunner(traits);
87 }
88 
89 // static
CreateSequencedTaskRunner(const TaskTraits & traits)90 scoped_refptr<SequencedTaskRunner> ThreadPool::CreateSequencedTaskRunner(
91     const TaskTraits& traits) {
92   return GetThreadPoolImpl()->CreateSequencedTaskRunner(traits);
93 }
94 
95 // static
96 scoped_refptr<UpdateableSequencedTaskRunner>
CreateUpdateableSequencedTaskRunner(const TaskTraits & traits)97 ThreadPool::CreateUpdateableSequencedTaskRunner(const TaskTraits& traits) {
98   return GetThreadPoolImpl()->CreateUpdateableSequencedTaskRunner(traits);
99 }
100 
101 // static
CreateSingleThreadTaskRunner(const TaskTraits & traits,SingleThreadTaskRunnerThreadMode thread_mode)102 scoped_refptr<SingleThreadTaskRunner> ThreadPool::CreateSingleThreadTaskRunner(
103     const TaskTraits& traits,
104     SingleThreadTaskRunnerThreadMode thread_mode) {
105   return GetThreadPoolImpl()->CreateSingleThreadTaskRunner(traits, thread_mode);
106 }
107 
108 #if BUILDFLAG(IS_WIN)
109 // static
CreateCOMSTATaskRunner(const TaskTraits & traits,SingleThreadTaskRunnerThreadMode thread_mode)110 scoped_refptr<SingleThreadTaskRunner> ThreadPool::CreateCOMSTATaskRunner(
111     const TaskTraits& traits,
112     SingleThreadTaskRunnerThreadMode thread_mode) {
113   return GetThreadPoolImpl()->CreateCOMSTATaskRunner(traits, thread_mode);
114 }
115 #endif  // BUILDFLAG(IS_WIN)
116 
117 }  // namespace base
118