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

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

Issue 2831883003: Do not inherit TaskPriority in TaskTraits. (Closed)
Patch Set: self-review Created 3 years, 8 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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h" 5 #include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/synchronization/atomic_flag.h" 9 #include "base/synchronization/atomic_flag.h"
10 #include "base/synchronization/lock.h" 10 #include "base/synchronization/lock.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/task_scheduler/delayed_task_manager.h" 12 #include "base/task_scheduler/delayed_task_manager.h"
13 #include "base/task_scheduler/post_task.h" 13 #include "base/task_scheduler/post_task.h"
14 #include "base/task_scheduler/scheduler_worker_pool_params.h" 14 #include "base/task_scheduler/scheduler_worker_pool_params.h"
15 #include "base/task_scheduler/task_tracker.h" 15 #include "base/task_scheduler/task_tracker.h"
16 #include "base/task_scheduler/task_traits.h" 16 #include "base/task_scheduler/task_traits.h"
17 #include "base/task_scheduler/test_utils.h"
17 #include "base/test/test_timeouts.h" 18 #include "base/test/test_timeouts.h"
18 #include "base/threading/platform_thread.h" 19 #include "base/threading/platform_thread.h"
19 #include "base/threading/simple_thread.h" 20 #include "base/threading/simple_thread.h"
20 #include "base/threading/thread.h" 21 #include "base/threading/thread.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
23 #if defined(OS_WIN) 24 #if defined(OS_WIN)
24 #include <windows.h> 25 #include <windows.h>
25 #include <objbase.h> 26 #include <objbase.h>
26 27
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 ADD_FAILURE() << "Ran a task that shouldn't run."; 87 ADD_FAILURE() << "Ran a task that shouldn't run.";
87 } 88 }
88 89
89 } // namespace 90 } // namespace
90 91
91 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) { 92 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) {
92 scoped_refptr<SingleThreadTaskRunner> task_runner_1 = 93 scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
93 single_thread_task_runner_manager_ 94 single_thread_task_runner_manager_
94 ->CreateSingleThreadTaskRunnerWithTraits( 95 ->CreateSingleThreadTaskRunnerWithTraits(
95 "A", ThreadPriority::NORMAL, 96 "A", ThreadPriority::NORMAL,
96 TaskTraits().WithShutdownBehavior( 97 test::CreateTaskTraits().WithShutdownBehavior(
97 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 98 TaskShutdownBehavior::BLOCK_SHUTDOWN));
98 scoped_refptr<SingleThreadTaskRunner> task_runner_2 = 99 scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
99 single_thread_task_runner_manager_ 100 single_thread_task_runner_manager_
100 ->CreateSingleThreadTaskRunnerWithTraits( 101 ->CreateSingleThreadTaskRunnerWithTraits(
101 "B", ThreadPriority::NORMAL, 102 "B", ThreadPriority::NORMAL,
102 TaskTraits().WithShutdownBehavior( 103 test::CreateTaskTraits().WithShutdownBehavior(
103 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 104 TaskShutdownBehavior::BLOCK_SHUTDOWN));
104 105
105 PlatformThreadRef thread_ref_1; 106 PlatformThreadRef thread_ref_1;
106 task_runner_1->PostTask(FROM_HERE, 107 task_runner_1->PostTask(FROM_HERE,
107 BindOnce(&CaptureThreadRef, &thread_ref_1)); 108 BindOnce(&CaptureThreadRef, &thread_ref_1));
108 PlatformThreadRef thread_ref_2; 109 PlatformThreadRef thread_ref_2;
109 task_runner_2->PostTask(FROM_HERE, 110 task_runner_2->PostTask(FROM_HERE,
110 BindOnce(&CaptureThreadRef, &thread_ref_2)); 111 BindOnce(&CaptureThreadRef, &thread_ref_2));
111 112
112 task_tracker_.Shutdown(); 113 task_tracker_.Shutdown();
113 114
114 ASSERT_FALSE(thread_ref_1.is_null()); 115 ASSERT_FALSE(thread_ref_1.is_null());
115 ASSERT_FALSE(thread_ref_2.is_null()); 116 ASSERT_FALSE(thread_ref_2.is_null());
116 EXPECT_NE(thread_ref_1, thread_ref_2); 117 EXPECT_NE(thread_ref_1, thread_ref_2);
117 } 118 }
118 119
119 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) { 120 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PrioritySetCorrectly) {
120 // Why are events used here instead of the task tracker? 121 // Why are events used here instead of the task tracker?
121 // Shutting down can cause priorities to get raised. This means we have to use 122 // Shutting down can cause priorities to get raised. This means we have to use
122 // events to determine when a task is run. 123 // events to determine when a task is run.
123 scoped_refptr<SingleThreadTaskRunner> task_runner_background = 124 scoped_refptr<SingleThreadTaskRunner> task_runner_background =
124 single_thread_task_runner_manager_ 125 single_thread_task_runner_manager_
125 ->CreateSingleThreadTaskRunnerWithTraits( 126 ->CreateSingleThreadTaskRunnerWithTraits(
126 "Background", ThreadPriority::BACKGROUND, 127 "Background", ThreadPriority::BACKGROUND,
127 TaskTraits().WithPriority(TaskPriority::BACKGROUND)); 128 test::CreateTaskTraits().WithPriority(TaskPriority::BACKGROUND));
128 scoped_refptr<SingleThreadTaskRunner> task_runner_normal = 129 scoped_refptr<SingleThreadTaskRunner> task_runner_normal =
129 single_thread_task_runner_manager_ 130 single_thread_task_runner_manager_
130 ->CreateSingleThreadTaskRunnerWithTraits( 131 ->CreateSingleThreadTaskRunnerWithTraits(
131 "Normal", ThreadPriority::NORMAL, 132 "Normal", ThreadPriority::NORMAL,
132 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE)); 133 test::CreateTaskTraits().WithPriority(
134 TaskPriority::USER_VISIBLE));
133 135
134 ThreadPriority thread_priority_background; 136 ThreadPriority thread_priority_background;
135 task_runner_background->PostTask( 137 task_runner_background->PostTask(
136 FROM_HERE, BindOnce(&CaptureThreadPriority, &thread_priority_background)); 138 FROM_HERE, BindOnce(&CaptureThreadPriority, &thread_priority_background));
137 WaitableEvent waitable_event_background( 139 WaitableEvent waitable_event_background(
138 WaitableEvent::ResetPolicy::MANUAL, 140 WaitableEvent::ResetPolicy::MANUAL,
139 WaitableEvent::InitialState::NOT_SIGNALED); 141 WaitableEvent::InitialState::NOT_SIGNALED);
140 task_runner_background->PostTask( 142 task_runner_background->PostTask(
141 FROM_HERE, 143 FROM_HERE,
142 BindOnce(&WaitableEvent::Signal, Unretained(&waitable_event_background))); 144 BindOnce(&WaitableEvent::Signal, Unretained(&waitable_event_background)));
(...skipping 12 matching lines...) Expand all
155 waitable_event_normal.Wait(); 157 waitable_event_normal.Wait();
156 158
157 if (Lock::HandlesMultipleThreadPriorities()) 159 if (Lock::HandlesMultipleThreadPriorities())
158 EXPECT_EQ(ThreadPriority::BACKGROUND, thread_priority_background); 160 EXPECT_EQ(ThreadPriority::BACKGROUND, thread_priority_background);
159 else 161 else
160 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_background); 162 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_background);
161 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_normal); 163 EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_normal);
162 } 164 }
163 165
164 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostTaskAfterShutdown) { 166 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostTaskAfterShutdown) {
165 auto task_runner = single_thread_task_runner_manager_ 167 auto task_runner =
166 ->CreateSingleThreadTaskRunnerWithTraits( 168 single_thread_task_runner_manager_
167 "A", ThreadPriority::NORMAL, TaskTraits()); 169 ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
170 test::CreateTaskTraits());
168 task_tracker_.Shutdown(); 171 task_tracker_.Shutdown();
169 EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun))); 172 EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
170 } 173 }
171 174
172 // Verify that a Task runs shortly after its delay expires. 175 // Verify that a Task runs shortly after its delay expires.
173 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) { 176 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, PostDelayedTask) {
174 TimeTicks start_time = TimeTicks::Now(); 177 TimeTicks start_time = TimeTicks::Now();
175 178
176 // Post a task with a short delay. 179 // Post a task with a short delay.
177 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, 180 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
178 WaitableEvent::InitialState::NOT_SIGNALED); 181 WaitableEvent::InitialState::NOT_SIGNALED);
179 auto task_runner = single_thread_task_runner_manager_ 182 auto task_runner =
180 ->CreateSingleThreadTaskRunnerWithTraits( 183 single_thread_task_runner_manager_
181 "A", ThreadPriority::NORMAL, TaskTraits()); 184 ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
185 test::CreateTaskTraits());
182 EXPECT_TRUE(task_runner->PostDelayedTask( 186 EXPECT_TRUE(task_runner->PostDelayedTask(
183 FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)), 187 FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)),
184 TestTimeouts::tiny_timeout())); 188 TestTimeouts::tiny_timeout()));
185 189
186 // Wait until the task runs. 190 // Wait until the task runs.
187 task_ran.Wait(); 191 task_ran.Wait();
188 192
189 // Expect the task to run after its delay expires, but not more than 250 ms 193 // Expect the task to run after its delay expires, but not more than 250 ms
190 // after that. 194 // after that.
191 const TimeDelta actual_delay = TimeTicks::Now() - start_time; 195 const TimeDelta actual_delay = TimeTicks::Now() - start_time;
192 EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout()); 196 EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout());
193 EXPECT_LT(actual_delay, 197 EXPECT_LT(actual_delay,
194 TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout()); 198 TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout());
195 } 199 }
196 200
197 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, 201 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
198 RunsTasksOnCurrentThread) { 202 RunsTasksOnCurrentThread) {
199 scoped_refptr<SingleThreadTaskRunner> task_runner_1 = 203 scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
200 single_thread_task_runner_manager_ 204 single_thread_task_runner_manager_
201 ->CreateSingleThreadTaskRunnerWithTraits( 205 ->CreateSingleThreadTaskRunnerWithTraits(
202 "A", ThreadPriority::NORMAL, 206 "A", ThreadPriority::NORMAL,
203 TaskTraits().WithShutdownBehavior( 207 test::CreateTaskTraits().WithShutdownBehavior(
204 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 208 TaskShutdownBehavior::BLOCK_SHUTDOWN));
205 scoped_refptr<SingleThreadTaskRunner> task_runner_2 = 209 scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
206 single_thread_task_runner_manager_ 210 single_thread_task_runner_manager_
207 ->CreateSingleThreadTaskRunnerWithTraits( 211 ->CreateSingleThreadTaskRunnerWithTraits(
208 "B", ThreadPriority::NORMAL, 212 "B", ThreadPriority::NORMAL,
209 TaskTraits().WithShutdownBehavior( 213 test::CreateTaskTraits().WithShutdownBehavior(
210 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 214 TaskShutdownBehavior::BLOCK_SHUTDOWN));
211 215
212 EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread()); 216 EXPECT_FALSE(task_runner_1->RunsTasksOnCurrentThread());
213 EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread()); 217 EXPECT_FALSE(task_runner_2->RunsTasksOnCurrentThread());
214 218
215 task_runner_1->PostTask( 219 task_runner_1->PostTask(
216 FROM_HERE, BindOnce( 220 FROM_HERE, BindOnce(
217 [](scoped_refptr<SingleThreadTaskRunner> task_runner_1, 221 [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
218 scoped_refptr<SingleThreadTaskRunner> task_runner_2) { 222 scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
219 EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread()); 223 EXPECT_TRUE(task_runner_1->RunsTasksOnCurrentThread());
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 284
281 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) { 285 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) {
282 // Exercises the codepath where the workers are unavailable for unregistration 286 // Exercises the codepath where the workers are unavailable for unregistration
283 // because of a Join call. 287 // because of a Join call.
284 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, 288 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
285 WaitableEvent::InitialState::NOT_SIGNALED); 289 WaitableEvent::InitialState::NOT_SIGNALED);
286 WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL, 290 WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL,
287 WaitableEvent::InitialState::NOT_SIGNALED); 291 WaitableEvent::InitialState::NOT_SIGNALED);
288 292
289 { 293 {
290 auto task_runner = single_thread_task_runner_manager_ 294 auto task_runner =
291 ->CreateSingleThreadTaskRunnerWithTraits( 295 single_thread_task_runner_manager_
292 "A", ThreadPriority::NORMAL, 296 ->CreateSingleThreadTaskRunnerWithTraits(
293 TaskTraits().WithBaseSyncPrimitives()); 297 "A", ThreadPriority::NORMAL,
298 test::CreateTaskTraits().WithBaseSyncPrimitives());
294 EXPECT_TRUE(task_runner->PostTask( 299 EXPECT_TRUE(task_runner->PostTask(
295 FROM_HERE, 300 FROM_HERE,
296 BindOnce(&WaitableEvent::Signal, Unretained(&task_running)))); 301 BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
297 EXPECT_TRUE(task_runner->PostTask( 302 EXPECT_TRUE(task_runner->PostTask(
298 FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking)))); 303 FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking))));
299 } 304 }
300 305
301 task_running.Wait(); 306 task_running.Wait();
302 CallJoinFromDifferentThread join_from_different_thread( 307 CallJoinFromDifferentThread join_from_different_thread(
303 single_thread_task_runner_manager_.get()); 308 single_thread_task_runner_manager_.get());
304 join_from_different_thread.Start(); 309 join_from_different_thread.Start();
305 join_from_different_thread.WaitForRunToStart(); 310 join_from_different_thread.WaitForRunToStart();
306 task_blocking.Signal(); 311 task_blocking.Signal();
307 join_from_different_thread.Join(); 312 join_from_different_thread.Join();
308 } 313 }
309 314
310 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, 315 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest,
311 ConcurrentJoinExtraSkippedTask) { 316 ConcurrentJoinExtraSkippedTask) {
312 // Tests to make sure that tasks are properly cleaned up at Join, allowing 317 // Tests to make sure that tasks are properly cleaned up at Join, allowing
313 // SingleThreadTaskRunners to unregister themselves. 318 // SingleThreadTaskRunners to unregister themselves.
314 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, 319 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
315 WaitableEvent::InitialState::NOT_SIGNALED); 320 WaitableEvent::InitialState::NOT_SIGNALED);
316 WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL, 321 WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL,
317 WaitableEvent::InitialState::NOT_SIGNALED); 322 WaitableEvent::InitialState::NOT_SIGNALED);
318 323
319 { 324 {
320 auto task_runner = single_thread_task_runner_manager_ 325 auto task_runner =
321 ->CreateSingleThreadTaskRunnerWithTraits( 326 single_thread_task_runner_manager_
322 "A", ThreadPriority::NORMAL, 327 ->CreateSingleThreadTaskRunnerWithTraits(
323 TaskTraits().WithBaseSyncPrimitives()); 328 "A", ThreadPriority::NORMAL,
329 test::CreateTaskTraits().WithBaseSyncPrimitives());
324 EXPECT_TRUE(task_runner->PostTask( 330 EXPECT_TRUE(task_runner->PostTask(
325 FROM_HERE, 331 FROM_HERE,
326 BindOnce(&WaitableEvent::Signal, Unretained(&task_running)))); 332 BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
327 EXPECT_TRUE(task_runner->PostTask( 333 EXPECT_TRUE(task_runner->PostTask(
328 FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking)))); 334 FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking))));
329 EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindOnce(&DoNothing))); 335 EXPECT_TRUE(task_runner->PostTask(FROM_HERE, BindOnce(&DoNothing)));
330 } 336 }
331 337
332 task_running.Wait(); 338 task_running.Wait();
333 CallJoinFromDifferentThread join_from_different_thread( 339 CallJoinFromDifferentThread join_from_different_thread(
334 single_thread_task_runner_manager_.get()); 340 single_thread_task_runner_manager_.get());
335 join_from_different_thread.Start(); 341 join_from_different_thread.Start();
336 join_from_different_thread.WaitForRunToStart(); 342 join_from_different_thread.WaitForRunToStart();
337 task_blocking.Signal(); 343 task_blocking.Signal();
338 join_from_different_thread.Join(); 344 join_from_different_thread.Join();
339 } 345 }
340 346
341 #if defined(OS_WIN) 347 #if defined(OS_WIN)
342 348
343 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) { 349 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTAInitialized) {
344 scoped_refptr<SingleThreadTaskRunner> com_task_runner = 350 scoped_refptr<SingleThreadTaskRunner> com_task_runner =
345 single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( 351 single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
346 "A", ThreadPriority::NORMAL, 352 "A", ThreadPriority::NORMAL,
347 TaskTraits().WithShutdownBehavior( 353 test::CreateTaskTraits().WithShutdownBehavior(
348 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 354 TaskShutdownBehavior::BLOCK_SHUTDOWN));
349 355
350 com_task_runner->PostTask( 356 com_task_runner->PostTask(
351 FROM_HERE, BindOnce([]() { 357 FROM_HERE, BindOnce([]() {
352 HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); 358 HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
353 if (SUCCEEDED(hr)) { 359 if (SUCCEEDED(hr)) {
354 ADD_FAILURE() << "COM STA was not initialized on this thread"; 360 ADD_FAILURE() << "COM STA was not initialized on this thread";
355 CoUninitialize(); 361 CoUninitialize();
356 } 362 }
357 })); 363 }));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
401 407
402 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerTestWin); 408 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerTestWin);
403 }; 409 };
404 410
405 } // namespace 411 } // namespace
406 412
407 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTestWin, PumpsMessages) { 413 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTestWin, PumpsMessages) {
408 scoped_refptr<SingleThreadTaskRunner> com_task_runner = 414 scoped_refptr<SingleThreadTaskRunner> com_task_runner =
409 single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits( 415 single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
410 "A", ThreadPriority::NORMAL, 416 "A", ThreadPriority::NORMAL,
411 TaskTraits().WithShutdownBehavior( 417 test::CreateTaskTraits().WithShutdownBehavior(
412 TaskShutdownBehavior::BLOCK_SHUTDOWN)); 418 TaskShutdownBehavior::BLOCK_SHUTDOWN));
413 HWND hwnd = nullptr; 419 HWND hwnd = nullptr;
414 // HWNDs process messages on the thread that created them, so we have to 420 // HWNDs process messages on the thread that created them, so we have to
415 // create them within the context of the task runner to properly simulate a 421 // create them within the context of the task runner to properly simulate a
416 // COM callback. 422 // COM callback.
417 com_task_runner->PostTask( 423 com_task_runner->PostTask(
418 FROM_HERE, 424 FROM_HERE,
419 BindOnce( 425 BindOnce(
420 [](TaskSchedulerSingleThreadTaskRunnerManagerTestWin* test_harness, 426 [](TaskSchedulerSingleThreadTaskRunnerManagerTestWin* test_harness,
421 HWND* hwnd) { *hwnd = test_harness->CreateTestWindow(); }, 427 HWND* hwnd) { *hwnd = test_harness->CreateTestWindow(); },
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 } // namespace 460 } // namespace
455 461
456 // Verify that a task posted before Start() doesn't run until Start() is called. 462 // Verify that a task posted before Start() doesn't run until Start() is called.
457 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest, 463 TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest,
458 PostTaskBeforeStart) { 464 PostTaskBeforeStart) {
459 AtomicFlag manager_started; 465 AtomicFlag manager_started;
460 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, 466 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
461 WaitableEvent::InitialState::NOT_SIGNALED); 467 WaitableEvent::InitialState::NOT_SIGNALED);
462 single_thread_task_runner_manager_ 468 single_thread_task_runner_manager_
463 ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL, 469 ->CreateSingleThreadTaskRunnerWithTraits("A", ThreadPriority::NORMAL,
464 TaskTraits()) 470 test::CreateTaskTraits())
465 ->PostTask( 471 ->PostTask(
466 FROM_HERE, 472 FROM_HERE,
467 BindOnce( 473 BindOnce(
468 [](WaitableEvent* task_running, AtomicFlag* manager_started) { 474 [](WaitableEvent* task_running, AtomicFlag* manager_started) {
469 task_running->Signal(); 475 task_running->Signal();
470 476
471 // The task should not run before Start(). 477 // The task should not run before Start().
472 EXPECT_TRUE(manager_started->IsSet()); 478 EXPECT_TRUE(manager_started->IsSet());
473 }, 479 },
474 Unretained(&task_running), Unretained(&manager_started))); 480 Unretained(&task_running), Unretained(&manager_started)));
475 481
476 // Wait a little bit to make sure that the task isn't scheduled before start. 482 // Wait a little bit to make sure that the task isn't scheduled before start.
477 // Note: This test won't catch a case where the task is scheduled between 483 // Note: This test won't catch a case where the task is scheduled between
478 // setting |manager_started| and calling Start(). However, we expect the test 484 // setting |manager_started| and calling Start(). However, we expect the test
479 // to be flaky if the tested code allows that to happen. 485 // to be flaky if the tested code allows that to happen.
480 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); 486 PlatformThread::Sleep(TestTimeouts::tiny_timeout());
481 manager_started.Set(); 487 manager_started.Set();
482 single_thread_task_runner_manager_->Start(); 488 single_thread_task_runner_manager_->Start();
483 489
484 // This should not hang if the task is scheduled after Start(). 490 // This should not hang if the task is scheduled after Start().
485 task_running.Wait(); 491 task_running.Wait();
486 } 492 }
487 493
488 } // namespace internal 494 } // namespace internal
489 } // namespace base 495 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698