OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/task_scheduler_impl.h" | 5 #include "base/task_scheduler/task_scheduler_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 TaskTraits().WithPriority(priority).MayBlock(), execution_mode)); | 171 TaskTraits().WithPriority(priority).MayBlock(), execution_mode)); |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 return params; | 175 return params; |
176 } | 176 } |
177 | 177 |
178 class TaskSchedulerImplTest | 178 class TaskSchedulerImplTest |
179 : public testing::TestWithParam<TraitsExecutionModePair> { | 179 : public testing::TestWithParam<TraitsExecutionModePair> { |
180 protected: | 180 protected: |
181 TaskSchedulerImplTest() = default; | 181 TaskSchedulerImplTest() : scheduler_("Test") {} |
182 | 182 |
183 void SetUp() override { | 183 void StartTaskScheduler() { |
184 using StandbyThreadPolicy = SchedulerWorkerPoolParams::StandbyThreadPolicy; | 184 using StandbyThreadPolicy = SchedulerWorkerPoolParams::StandbyThreadPolicy; |
185 | 185 |
186 constexpr TimeDelta kSuggestedReclaimTime = TimeDelta::FromSeconds(30); | 186 constexpr TimeDelta kSuggestedReclaimTime = TimeDelta::FromSeconds(30); |
187 constexpr int kMaxNumBackgroundThreads = 1; | 187 constexpr int kMaxNumBackgroundThreads = 1; |
188 constexpr int kMaxNumBackgroundBlockingThreads = 3; | 188 constexpr int kMaxNumBackgroundBlockingThreads = 3; |
189 constexpr int kMaxNumForegroundThreads = 4; | 189 constexpr int kMaxNumForegroundThreads = 4; |
190 constexpr int kMaxNumForegroundBlockingThreads = 12; | 190 constexpr int kMaxNumForegroundBlockingThreads = 12; |
191 | 191 |
192 scheduler_ = TaskSchedulerImpl::Create( | 192 scheduler_.Start( |
193 "Test", {{StandbyThreadPolicy::LAZY, kMaxNumBackgroundThreads, | 193 {{StandbyThreadPolicy::LAZY, kMaxNumBackgroundThreads, |
194 kSuggestedReclaimTime}, | 194 kSuggestedReclaimTime}, |
195 {StandbyThreadPolicy::LAZY, kMaxNumBackgroundBlockingThreads, | 195 {StandbyThreadPolicy::LAZY, kMaxNumBackgroundBlockingThreads, |
196 kSuggestedReclaimTime}, | 196 kSuggestedReclaimTime}, |
197 {StandbyThreadPolicy::LAZY, kMaxNumForegroundThreads, | 197 {StandbyThreadPolicy::LAZY, kMaxNumForegroundThreads, |
198 kSuggestedReclaimTime}, | 198 kSuggestedReclaimTime}, |
199 {StandbyThreadPolicy::LAZY, kMaxNumForegroundBlockingThreads, | 199 {StandbyThreadPolicy::LAZY, kMaxNumForegroundBlockingThreads, |
200 kSuggestedReclaimTime}}); | 200 kSuggestedReclaimTime}}); |
201 | |
202 ASSERT_TRUE(scheduler_); | |
203 } | 201 } |
204 | 202 |
205 void TearDown() override { scheduler_->JoinForTesting(); } | 203 void TearDown() override { scheduler_.JoinForTesting(); } |
206 | 204 |
207 std::unique_ptr<TaskSchedulerImpl> scheduler_; | 205 TaskSchedulerImpl scheduler_; |
208 | 206 |
209 private: | 207 private: |
210 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerImplTest); | 208 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerImplTest); |
211 }; | 209 }; |
212 | 210 |
213 } // namespace | 211 } // namespace |
214 | 212 |
215 // Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized | 213 // Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized |
216 // TaskTraits and no delay runs on a thread with the expected priority and I/O | 214 // TaskTraits and no delay runs on a thread with the expected priority and I/O |
217 // restrictions. The ExecutionMode parameter is ignored by this test. | 215 // restrictions. The ExecutionMode parameter is ignored by this test. |
218 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelay) { | 216 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelay) { |
217 StartTaskScheduler(); | |
219 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 218 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
220 WaitableEvent::InitialState::NOT_SIGNALED); | 219 WaitableEvent::InitialState::NOT_SIGNALED); |
221 scheduler_->PostDelayedTaskWithTraits( | 220 scheduler_.PostDelayedTaskWithTraits( |
222 FROM_HERE, GetParam().traits, | 221 FROM_HERE, GetParam().traits, |
223 BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits, | 222 BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits, |
224 Unretained(&task_ran)), | 223 Unretained(&task_ran)), |
225 TimeDelta()); | 224 TimeDelta()); |
226 task_ran.Wait(); | 225 task_ran.Wait(); |
227 } | 226 } |
228 | 227 |
229 // Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized | 228 // Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized |
230 // TaskTraits and a non-zero delay runs on a thread with the expected priority | 229 // TaskTraits and a non-zero delay runs on a thread with the expected priority |
231 // and I/O restrictions after the delay expires. The ExecutionMode parameter is | 230 // and I/O restrictions after the delay expires. The ExecutionMode parameter is |
232 // ignored by this test. | 231 // ignored by this test. |
233 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelay) { | 232 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelay) { |
233 StartTaskScheduler(); | |
234 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 234 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
235 WaitableEvent::InitialState::NOT_SIGNALED); | 235 WaitableEvent::InitialState::NOT_SIGNALED); |
236 scheduler_->PostDelayedTaskWithTraits( | 236 scheduler_.PostDelayedTaskWithTraits( |
237 FROM_HERE, GetParam().traits, | 237 FROM_HERE, GetParam().traits, |
238 BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits, | 238 BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits, |
239 TimeTicks::Now() + TestTimeouts::tiny_timeout(), | 239 TimeTicks::Now() + TestTimeouts::tiny_timeout(), |
240 Unretained(&task_ran)), | 240 Unretained(&task_ran)), |
241 TestTimeouts::tiny_timeout()); | 241 TestTimeouts::tiny_timeout()); |
242 task_ran.Wait(); | 242 task_ran.Wait(); |
243 } | 243 } |
244 | 244 |
245 // Verifies that Tasks posted via a TaskRunner with parameterized TaskTraits and | 245 // Verifies that Tasks posted via a TaskRunner with parameterized TaskTraits and |
246 // ExecutionMode run on a thread with the expected priority and I/O restrictions | 246 // ExecutionMode run on a thread with the expected priority and I/O restrictions |
247 // and respect the characteristics of their ExecutionMode. | 247 // and respect the characteristics of their ExecutionMode. |
248 TEST_P(TaskSchedulerImplTest, PostTasksViaTaskRunner) { | 248 TEST_P(TaskSchedulerImplTest, PostTasksViaTaskRunner) { |
249 StartTaskScheduler(); | |
249 test::TestTaskFactory factory( | 250 test::TestTaskFactory factory( |
250 CreateTaskRunnerWithTraitsAndExecutionMode( | 251 CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits, |
251 scheduler_.get(), GetParam().traits, GetParam().execution_mode), | 252 GetParam().execution_mode), |
252 GetParam().execution_mode); | 253 GetParam().execution_mode); |
253 EXPECT_FALSE(factory.task_runner()->RunsTasksOnCurrentThread()); | 254 EXPECT_FALSE(factory.task_runner()->RunsTasksOnCurrentThread()); |
254 | 255 |
255 const size_t kNumTasksPerTest = 150; | 256 const size_t kNumTasksPerTest = 150; |
256 for (size_t i = 0; i < kNumTasksPerTest; ++i) { | 257 for (size_t i = 0; i < kNumTasksPerTest; ++i) { |
257 factory.PostTask(test::TestTaskFactory::PostNestedTask::NO, | 258 factory.PostTask(test::TestTaskFactory::PostNestedTask::NO, |
258 Bind(&VerifyTaskEnvironment, GetParam().traits)); | 259 Bind(&VerifyTaskEnvironment, GetParam().traits)); |
259 } | 260 } |
260 | 261 |
261 factory.WaitForAllTasksToRun(); | 262 factory.WaitForAllTasksToRun(); |
262 } | 263 } |
263 | 264 |
265 // Verifies that a task posted via PostDelayedTaskWithTraits without a delay | |
266 // doesn't run before Start() is called. | |
267 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelayBeforeStart) { | |
268 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, | |
269 WaitableEvent::InitialState::NOT_SIGNALED); | |
270 scheduler_.PostDelayedTaskWithTraits( | |
271 FROM_HERE, GetParam().traits, | |
272 BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits, | |
273 Unretained(&task_running)), | |
274 TimeDelta()); | |
275 | |
276 // Wait a little bit to make sure that the task isn't scheduled before | |
277 // Start(). Note: This test won't catch a case where the task runs just after | |
278 // the check and before Start(). However, we expect the test to be flaky if | |
279 // the tested code allows that to happen. | |
280 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); | |
281 EXPECT_FALSE(task_running.IsSignaled()); | |
282 | |
283 StartTaskScheduler(); | |
284 | |
285 // This should not hang if the task is scheduled after Start(). | |
gab
2017/04/25 15:16:15
implicit IMO, remove comment (same below)
fdoray
2017/04/25 18:43:35
Done.
| |
286 task_running.Wait(); | |
287 } | |
288 | |
289 // Verifies that a task posted via PostDelayedTaskWithTraits with a delay | |
290 // doesn't run before Start() is called. | |
291 TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelayBeforeStart) { | |
292 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, | |
293 WaitableEvent::InitialState::NOT_SIGNALED); | |
294 scheduler_.PostDelayedTaskWithTraits( | |
295 FROM_HERE, GetParam().traits, | |
296 BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits, | |
297 TimeTicks::Now() + TestTimeouts::tiny_timeout(), | |
298 Unretained(&task_running)), | |
299 TestTimeouts::tiny_timeout()); | |
300 | |
301 // Wait a little bit to make sure that the task isn't scheduled before | |
302 // Start(). Note: This test won't catch a case where the task runs just after | |
303 // the check and before Start(). However, we expect the test to be flaky if | |
304 // the tested code allows that to happen. | |
305 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); | |
306 EXPECT_FALSE(task_running.IsSignaled()); | |
307 | |
308 StartTaskScheduler(); | |
309 | |
310 // This should not hang if the task is scheduled after Start(). | |
311 task_running.Wait(); | |
312 } | |
313 | |
314 // Verifies that a task posted via a TaskRunner doesn't run before Start() is | |
315 // called. | |
316 TEST_P(TaskSchedulerImplTest, PostTaskViaTaskRunnerBeforeStart) { | |
317 WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL, | |
318 WaitableEvent::InitialState::NOT_SIGNALED); | |
319 CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits, | |
320 GetParam().execution_mode) | |
321 ->PostTask(FROM_HERE, | |
322 BindOnce(&VerifyTaskEnvironmentAndSignalEvent, | |
323 GetParam().traits, Unretained(&task_running))); | |
324 | |
325 // Wait a little bit to make sure that the task isn't scheduled before | |
326 // Start(). Note: This test won't catch a case where the task runs just after | |
327 // the check and before Start(). However, we expect the test to be flaky if | |
328 // the tested code allows that to happen. | |
329 PlatformThread::Sleep(TestTimeouts::tiny_timeout()); | |
330 EXPECT_FALSE(task_running.IsSignaled()); | |
331 | |
332 StartTaskScheduler(); | |
333 | |
334 // This should not hang if the task is scheduled after Start(). | |
335 task_running.Wait(); | |
336 } | |
337 | |
264 INSTANTIATE_TEST_CASE_P(OneTraitsExecutionModePair, | 338 INSTANTIATE_TEST_CASE_P(OneTraitsExecutionModePair, |
265 TaskSchedulerImplTest, | 339 TaskSchedulerImplTest, |
266 ::testing::ValuesIn(GetTraitsExecutionModePairs())); | 340 ::testing::ValuesIn(GetTraitsExecutionModePairs())); |
267 | 341 |
268 // Spawns threads that simultaneously post Tasks to TaskRunners with various | 342 // Spawns threads that simultaneously post Tasks to TaskRunners with various |
269 // TaskTraits and ExecutionModes. Verifies that each Task runs on a thread with | 343 // TaskTraits and ExecutionModes. Verifies that each Task runs on a thread with |
270 // the expected priority and I/O restrictions and respects the characteristics | 344 // the expected priority and I/O restrictions and respects the characteristics |
271 // of its ExecutionMode. | 345 // of its ExecutionMode. |
272 TEST_F(TaskSchedulerImplTest, MultipleTraitsExecutionModePairs) { | 346 TEST_F(TaskSchedulerImplTest, MultipleTraitsExecutionModePairs) { |
347 StartTaskScheduler(); | |
273 std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks; | 348 std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks; |
274 for (const auto& traits_execution_mode_pair : GetTraitsExecutionModePairs()) { | 349 for (const auto& traits_execution_mode_pair : GetTraitsExecutionModePairs()) { |
275 threads_posting_tasks.push_back(WrapUnique(new ThreadPostingTasks( | 350 threads_posting_tasks.push_back(WrapUnique( |
276 scheduler_.get(), traits_execution_mode_pair.traits, | 351 new ThreadPostingTasks(&scheduler_, traits_execution_mode_pair.traits, |
277 traits_execution_mode_pair.execution_mode))); | 352 traits_execution_mode_pair.execution_mode))); |
278 threads_posting_tasks.back()->Start(); | 353 threads_posting_tasks.back()->Start(); |
279 } | 354 } |
280 | 355 |
281 for (const auto& thread : threads_posting_tasks) { | 356 for (const auto& thread : threads_posting_tasks) { |
282 thread->WaitForAllTasksToRun(); | 357 thread->WaitForAllTasksToRun(); |
283 thread->Join(); | 358 thread->Join(); |
284 } | 359 } |
285 } | 360 } |
286 | 361 |
287 TEST_F(TaskSchedulerImplTest, GetMaxConcurrentTasksWithTraitsDeprecated) { | 362 TEST_F(TaskSchedulerImplTest, GetMaxConcurrentTasksWithTraitsDeprecated) { |
288 EXPECT_EQ(1, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 363 StartTaskScheduler(); |
364 EXPECT_EQ(1, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( | |
289 TaskTraits().WithPriority(TaskPriority::BACKGROUND))); | 365 TaskTraits().WithPriority(TaskPriority::BACKGROUND))); |
290 EXPECT_EQ( | 366 EXPECT_EQ( |
291 3, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 367 3, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
292 TaskTraits().WithPriority(TaskPriority::BACKGROUND).MayBlock())); | 368 TaskTraits().WithPriority(TaskPriority::BACKGROUND).MayBlock())); |
293 EXPECT_EQ(4, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 369 EXPECT_EQ(4, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
294 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE))); | 370 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE))); |
295 EXPECT_EQ( | 371 EXPECT_EQ( |
296 12, | 372 12, |
297 scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 373 scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
298 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE).MayBlock())); | 374 TaskTraits().WithPriority(TaskPriority::USER_VISIBLE).MayBlock())); |
299 EXPECT_EQ(4, scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 375 EXPECT_EQ(4, scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
300 TaskTraits().WithPriority(TaskPriority::USER_BLOCKING))); | 376 TaskTraits().WithPriority(TaskPriority::USER_BLOCKING))); |
301 EXPECT_EQ( | 377 EXPECT_EQ( |
302 12, | 378 12, |
303 scheduler_->GetMaxConcurrentTasksWithTraitsDeprecated( | 379 scheduler_.GetMaxConcurrentTasksWithTraitsDeprecated( |
304 TaskTraits().WithPriority(TaskPriority::USER_BLOCKING).MayBlock())); | 380 TaskTraits().WithPriority(TaskPriority::USER_BLOCKING).MayBlock())); |
305 } | 381 } |
306 | 382 |
307 // Verify that the RunsTasksOnCurrentThread() method of a SequencedTaskRunner | 383 // Verify that the RunsTasksOnCurrentThread() method of a SequencedTaskRunner |
308 // returns false when called from a task that isn't part of the sequence. | 384 // returns false when called from a task that isn't part of the sequence. |
309 TEST_F(TaskSchedulerImplTest, SequencedRunsTasksOnCurrentThread) { | 385 TEST_F(TaskSchedulerImplTest, SequencedRunsTasksOnCurrentThread) { |
386 StartTaskScheduler(); | |
310 auto single_thread_task_runner = | 387 auto single_thread_task_runner = |
311 scheduler_->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); | 388 scheduler_.CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
312 auto sequenced_task_runner = | 389 auto sequenced_task_runner = |
313 scheduler_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); | 390 scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
314 | 391 |
315 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 392 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
316 WaitableEvent::InitialState::NOT_SIGNALED); | 393 WaitableEvent::InitialState::NOT_SIGNALED); |
317 single_thread_task_runner->PostTask( | 394 single_thread_task_runner->PostTask( |
318 FROM_HERE, | 395 FROM_HERE, |
319 BindOnce( | 396 BindOnce( |
320 [](scoped_refptr<TaskRunner> sequenced_task_runner, | 397 [](scoped_refptr<TaskRunner> sequenced_task_runner, |
321 WaitableEvent* task_ran) { | 398 WaitableEvent* task_ran) { |
322 EXPECT_FALSE(sequenced_task_runner->RunsTasksOnCurrentThread()); | 399 EXPECT_FALSE(sequenced_task_runner->RunsTasksOnCurrentThread()); |
323 task_ran->Signal(); | 400 task_ran->Signal(); |
324 }, | 401 }, |
325 sequenced_task_runner, Unretained(&task_ran))); | 402 sequenced_task_runner, Unretained(&task_ran))); |
326 task_ran.Wait(); | 403 task_ran.Wait(); |
327 } | 404 } |
328 | 405 |
329 // Verify that the RunsTasksOnCurrentThread() method of a SingleThreadTaskRunner | 406 // Verify that the RunsTasksOnCurrentThread() method of a SingleThreadTaskRunner |
330 // returns false when called from a task that isn't part of the sequence. | 407 // returns false when called from a task that isn't part of the sequence. |
331 TEST_F(TaskSchedulerImplTest, SingleThreadRunsTasksOnCurrentThread) { | 408 TEST_F(TaskSchedulerImplTest, SingleThreadRunsTasksOnCurrentThread) { |
409 StartTaskScheduler(); | |
332 auto sequenced_task_runner = | 410 auto sequenced_task_runner = |
333 scheduler_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); | 411 scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits()); |
334 auto single_thread_task_runner = | 412 auto single_thread_task_runner = |
335 scheduler_->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); | 413 scheduler_.CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); |
336 | 414 |
337 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 415 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
338 WaitableEvent::InitialState::NOT_SIGNALED); | 416 WaitableEvent::InitialState::NOT_SIGNALED); |
339 sequenced_task_runner->PostTask( | 417 sequenced_task_runner->PostTask( |
340 FROM_HERE, | 418 FROM_HERE, |
341 BindOnce( | 419 BindOnce( |
342 [](scoped_refptr<TaskRunner> single_thread_task_runner, | 420 [](scoped_refptr<TaskRunner> single_thread_task_runner, |
343 WaitableEvent* task_ran) { | 421 WaitableEvent* task_ran) { |
344 EXPECT_FALSE(single_thread_task_runner->RunsTasksOnCurrentThread()); | 422 EXPECT_FALSE(single_thread_task_runner->RunsTasksOnCurrentThread()); |
345 task_ran->Signal(); | 423 task_ran->Signal(); |
346 }, | 424 }, |
347 single_thread_task_runner, Unretained(&task_ran))); | 425 single_thread_task_runner, Unretained(&task_ran))); |
348 task_ran.Wait(); | 426 task_ran.Wait(); |
349 } | 427 } |
350 | 428 |
351 #if defined(OS_WIN) | 429 #if defined(OS_WIN) |
352 TEST_F(TaskSchedulerImplTest, COMSTATaskRunnersRunWithCOMSTA) { | 430 TEST_F(TaskSchedulerImplTest, COMSTATaskRunnersRunWithCOMSTA) { |
431 StartTaskScheduler(); | |
353 auto com_sta_task_runner = | 432 auto com_sta_task_runner = |
354 scheduler_->CreateCOMSTATaskRunnerWithTraits(TaskTraits()); | 433 scheduler_.CreateCOMSTATaskRunnerWithTraits(TaskTraits()); |
355 | 434 |
356 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 435 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
357 WaitableEvent::InitialState::NOT_SIGNALED); | 436 WaitableEvent::InitialState::NOT_SIGNALED); |
358 com_sta_task_runner->PostTask( | 437 com_sta_task_runner->PostTask( |
359 FROM_HERE, | 438 FROM_HERE, |
360 Bind( | 439 Bind( |
361 [](scoped_refptr<TaskRunner> single_thread_task_runner, | 440 [](scoped_refptr<TaskRunner> single_thread_task_runner, |
362 WaitableEvent* task_ran) { | 441 WaitableEvent* task_ran) { |
363 HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); | 442 HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); |
364 if (SUCCEEDED(hr)) { | 443 if (SUCCEEDED(hr)) { |
365 ADD_FAILURE() << "COM STA was not initialized on this thread"; | 444 ADD_FAILURE() << "COM STA was not initialized on this thread"; |
366 CoUninitialize(); | 445 CoUninitialize(); |
367 } | 446 } |
368 task_ran->Signal(); | 447 task_ran->Signal(); |
369 }, | 448 }, |
370 com_sta_task_runner, Unretained(&task_ran))); | 449 com_sta_task_runner, Unretained(&task_ran))); |
371 task_ran.Wait(); | 450 task_ran.Wait(); |
372 } | 451 } |
373 #endif // defined(OS_WIN) | 452 #endif // defined(OS_WIN) |
374 | 453 |
375 } // namespace internal | 454 } // namespace internal |
376 } // namespace base | 455 } // namespace base |
OLD | NEW |