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