thread_pool.cc 4.3 KB

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