Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: base/task_scheduler/scheduler_single_thread_worker_pool_manager_unittest.cc

Issue 2650383007: Move Task Scheduler Single Thread Task Runners to Dedicated Threads (Closed)
Patch Set: CR Feedback Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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
5 #include "base/task_scheduler/scheduler_single_thread_worker_pool_manager.h"
6
7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h"
9 #include "base/synchronization/lock.h"
10 #include "base/task_scheduler/delayed_task_manager.h"
11 #include "base/task_scheduler/scheduler_worker_pool_params.h"
12 #include "base/task_scheduler/task_tracker.h"
13 #include "base/task_scheduler/task_traits.h"
14 #include "base/threading/thread.h"
15 #include "base/threading/thread_local_storage.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace base {
19 namespace internal {
20
21 namespace {
22
23 constexpr size_t kMagicTlsValue = 42;
24
25 enum WorkerPoolType {
26 BACKGROUND_WORKER_POOL = 0,
27 FOREGROUND_WORKER_POOL,
28 };
29
30 static size_t GetThreadPoolIndexForTraits(const TaskTraits& traits) {
31 return traits.priority() == TaskPriority::BACKGROUND ? BACKGROUND_WORKER_POOL
32 : FOREGROUND_WORKER_POOL;
33 }
34
35 class TaskSchedulerSingleThreadWorkerPoolManagerTest : public testing::Test {
36 public:
37 TaskSchedulerSingleThreadWorkerPoolManagerTest()
38 : service_thread_("TaskSchedulerServiceThread") {}
39
40 void SetUp() override {
41 ASSERT_FALSE(delayed_task_manager_);
42 service_thread_.Start();
43
44 using StandbyThreadPolicy = SchedulerWorkerPoolParams::StandbyThreadPolicy;
45
46 std::vector<SchedulerWorkerPoolParams> params_vector;
47
48 ASSERT_EQ(BACKGROUND_WORKER_POOL, params_vector.size());
49 params_vector.emplace_back("Background", ThreadPriority::BACKGROUND,
50 StandbyThreadPolicy::LAZY, 1U, TimeDelta::Max());
51
52 ASSERT_EQ(FOREGROUND_WORKER_POOL, params_vector.size());
53 params_vector.emplace_back("Foreground", ThreadPriority::NORMAL,
54 StandbyThreadPolicy::LAZY, 1U, TimeDelta::Max());
55
56 delayed_task_manager_ =
57 MakeUnique<DelayedTaskManager>(service_thread_.task_runner());
58 single_thread_worker_pool_manager_ =
59 MakeUnique<SchedulerSingleThreadWorkerPoolManager>(
60 params_vector, Bind(&GetThreadPoolIndexForTraits), &task_tracker_,
61 delayed_task_manager_.get());
62 }
63
64 void TearDown() override {
65 single_thread_worker_pool_manager_->JoinForTesting();
66 single_thread_worker_pool_manager_.reset();
67 delayed_task_manager_.reset();
68 service_thread_.Stop();
69 }
70
71 protected:
72 std::unique_ptr<SchedulerSingleThreadWorkerPoolManager>
73 single_thread_worker_pool_manager_;
74
75 private:
76 TaskTracker task_tracker_;
77 Thread service_thread_;
78 std::unique_ptr<DelayedTaskManager> delayed_task_manager_;
79
80 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadWorkerPoolManagerTest);
81 };
82
83 void CaptureThreadId(PlatformThreadId* thread_id) {
84 ASSERT_TRUE(thread_id);
85 *thread_id = PlatformThread::CurrentId();
86 }
87
88 void CaptureThreadPriority(ThreadPriority* thread_priority) {
89 ASSERT_TRUE(thread_priority);
90 *thread_priority = PlatformThread::GetCurrentThreadPriority();
91 }
92
93 } // namespace
94
95 TEST_F(TaskSchedulerSingleThreadWorkerPoolManagerTest, DifferentThreadsUsed) {
96 scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
97 single_thread_worker_pool_manager_
98 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits());
99 scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
100 single_thread_worker_pool_manager_
101 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits());
102
103 PlatformThreadId thread_id_1 = kInvalidThreadId;
104 task_runner_1->PostTask(FROM_HERE, Bind(&CaptureThreadId, &thread_id_1));
105 PlatformThreadId thread_id_2 = kInvalidThreadId;
106 task_runner_2->PostTask(FROM_HERE, Bind(&CaptureThreadId, &thread_id_2));
107 single_thread_worker_pool_manager_->WaitForAllWorkersIdleForTesting();
108
109 ASSERT_NE(kInvalidThreadId, thread_id_1);
110 ASSERT_NE(kInvalidThreadId, thread_id_2);
111 EXPECT_NE(thread_id_1, thread_id_2);
112 }
113
114 TEST_F(TaskSchedulerSingleThreadWorkerPoolManagerTest, PrioritySetCorrectly) {
115 scoped_refptr<SingleThreadTaskRunner> task_runner_background =
116 single_thread_worker_pool_manager_
117 ->CreateSingleThreadTaskRunnerWithTraits(
118 TaskTraits().WithPriority(TaskPriority::BACKGROUND));
119 scoped_refptr<SingleThreadTaskRunner> task_runner_user_visible =
120 single_thread_worker_pool_manager_
121 ->CreateSingleThreadTaskRunnerWithTraits(
122 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE));
123 scoped_refptr<SingleThreadTaskRunner> task_runner_user_blocking =
124 single_thread_worker_pool_manager_
125 ->CreateSingleThreadTaskRunnerWithTraits(
126 TaskTraits().WithPriority(TaskPriority::USER_BLOCKING));
127
128 ThreadPriority thread_priority_background;
129 task_runner_background->PostTask(
130 FROM_HERE, Bind(&CaptureThreadPriority, &thread_priority_background));
131 ThreadPriority thread_priority_user_visible;
132 task_runner_user_visible->PostTask(
133 FROM_HERE, Bind(&CaptureThreadPriority, &thread_priority_user_visible));
134 ThreadPriority thread_priority_user_blocking;
135 task_runner_user_blocking->PostTask(
136 FROM_HERE, Bind(&CaptureThreadPriority, &thread_priority_user_blocking));
137 single_thread_worker_pool_manager_->WaitForAllWorkersIdleForTesting();
138
139 if (Lock::HandlesMultipleThreadPriorities())
140 EXPECT_EQ(ThreadPriority::BACKGROUND, thread_priority_background);
141 else
142 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_background);
143 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_user_visible);
144 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_user_blocking);
145 }
146
147 TEST_F(TaskSchedulerSingleThreadWorkerPoolManagerTest, ThreadsReused) {
148 scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
149 single_thread_worker_pool_manager_
150 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits());
151 ThreadLocalStorage::Slot slot;
152 task_runner_1->PostTask(
153 FROM_HERE, Bind(
154 [](ThreadLocalStorage::Slot* slot) {
155 slot->Set(reinterpret_cast<void*>(kMagicTlsValue));
156 },
157 base::Unretained(&slot)));
158 single_thread_worker_pool_manager_->WaitForAllWorkersIdleForTesting();
159 task_runner_1 = nullptr;
160
161 scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
162 single_thread_worker_pool_manager_
163 ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits());
164 size_t tls_value = 0;
165 task_runner_2->PostTask(
166 FROM_HERE, Bind(
167 [](ThreadLocalStorage::Slot* slot, size_t* tls_value) {
168 *tls_value = reinterpret_cast<size_t>(slot->Get());
169 },
170 Unretained(&slot), Unretained(&tls_value)));
171
172 single_thread_worker_pool_manager_->WaitForAllWorkersIdleForTesting();
173
174 EXPECT_EQ(42U, tls_value);
175 }
176
177 } // namespace internal
178 } // namespace base
OLDNEW
« no previous file with comments | « base/task_scheduler/scheduler_single_thread_worker_pool_manager.cc ('k') | base/task_scheduler/scheduler_worker_pool_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698