OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "config.h" | 5 #include "config.h" |
6 #include "platform/scheduler/Scheduler.h" | 6 #include "platform/scheduler/Scheduler.h" |
7 | 7 |
8 #include "platform/TestingPlatformSupport.h" | 8 #include "platform/TestingPlatformSupport.h" |
9 #include "platform/TraceLocation.h" | 9 #include "platform/TraceLocation.h" |
10 #include "public/platform/Platform.h" | 10 #include "public/platform/Platform.h" |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
312 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I2"))); | 312 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I2"))); |
313 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C2"))); | 313 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C2"))); |
314 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("IPC"))); | 314 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("IPC"))); |
315 | 315 |
316 runPendingTasks(); | 316 runPendingTasks(); |
317 EXPECT_THAT(m_order, testing::ElementsAre( | 317 EXPECT_THAT(m_order, testing::ElementsAre( |
318 std::string("L1"), std::string("L2"), std::string("I1"), std::string("C1 "), std::string("I2"), std::string("C2"), | 318 std::string("L1"), std::string("L2"), std::string("I1"), std::string("C1 "), std::string("I2"), std::string("C2"), |
319 std::string("IPC"))); | 319 std::string("IPC"))); |
320 } | 320 } |
321 | 321 |
322 TEST_F(SchedulerTest, TestTaskPrioritization_compositorPriorityPolicy) | |
323 { | |
324 m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); | |
325 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("L1"))); | |
326 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("L2"))); | |
327 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I1"))); | |
328 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C1"))); | |
329 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("I2"))); | |
330 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("C2"))); | |
331 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("IPC"))); | |
332 | |
333 runPendingTasks(); | |
334 EXPECT_THAT(m_order, testing::ElementsAre( | |
335 std::string("I1"), std::string("C1"), std::string("I2"), std::string("C2 "), std::string("L1"), std::string("L2"), | |
336 std::string("IPC"))); | |
337 } | |
338 | |
339 TEST_F(SchedulerTest, TestRentrantTask) | 322 TEST_F(SchedulerTest, TestRentrantTask) |
340 { | 323 { |
341 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVectorRee ntrantTask, this)); | 324 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVectorRee ntrantTask, this)); |
342 runPendingTasks(); | 325 runPendingTasks(); |
343 | 326 |
344 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4)); | 327 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4)); |
345 } | 328 } |
346 | 329 |
330 TEST_F(SchedulerTest, TestTasksRunAfterShutdown) | |
331 { | |
332 m_scheduler->postTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector, t his, std::string("1"))); | |
333 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect or, this, std::string("2"))); | |
334 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVector, this, std::string("3"))); | |
335 m_scheduler->postIpcTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVector , this, std::string("4"))); | |
347 | 336 |
348 TEST_F(SchedulerTest, TestRentrantInputTaskDuringShutdown) | |
349 { | |
350 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&SchedulerTest::appendToVect orReentrantInputTask, this)); | |
351 Scheduler::shutdown(); | 337 Scheduler::shutdown(); |
alexclarke
2014/10/06 14:11:03
Might be worth adding something between shutdown a
Sami
2014/10/06 14:59:18
Done.
| |
352 | 338 runPendingTasks(); |
353 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4)); | 339 EXPECT_THAT(m_order, testing::ElementsAre( |
354 } | 340 std::string("1"), std::string("2"), std::string("3"), std::string("4"))) ; |
355 | |
356 TEST_F(SchedulerTest, TestRentrantCompositorTaskDuringShutdown) | |
357 { | |
358 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&SchedulerTest::appendT oVectorReentrantCompositorTask, this)); | |
359 Scheduler::shutdown(); | |
360 | |
361 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4)); | |
362 } | 341 } |
363 | 342 |
364 bool s_shouldContinue; | 343 bool s_shouldContinue; |
365 void reentrantInputTask(Scheduler* scheduler) | 344 void reentrantInputTask(Scheduler* scheduler) |
366 { | 345 { |
367 if (s_shouldContinue) | 346 if (s_shouldContinue) |
368 scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, sched uler)); | 347 scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, sched uler)); |
369 } | 348 } |
370 | 349 |
371 void reentrantCompositorTask(Scheduler* scheduler) | 350 void reentrantCompositorTask(Scheduler* scheduler) |
(...skipping 26 matching lines...) Expand all Loading... | |
398 // If starvation occurs then this will never exit. | 377 // If starvation occurs then this will never exit. |
399 runPendingTasks(); | 378 runPendingTasks(); |
400 } | 379 } |
401 | 380 |
402 int s_dummyTaskCount; | 381 int s_dummyTaskCount; |
403 void dummyTask() | 382 void dummyTask() |
404 { | 383 { |
405 s_dummyTaskCount++; | 384 s_dummyTaskCount++; |
406 } | 385 } |
407 | 386 |
408 TEST_F(SchedulerTest, TestMultipleCallsToPostInputOrCompositorTaskResultsInOnlyO neMainThreadTask) | |
409 { | |
410 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); | |
411 | |
412 for (int i = 0; i < 10; i++) { | |
413 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | |
414 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); | |
415 } | |
416 | |
417 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks()); | |
418 } | |
419 | |
420 TEST_F(SchedulerTest, TestMainThreadTaskLifeCycle) | 387 TEST_F(SchedulerTest, TestMainThreadTaskLifeCycle) |
421 { | 388 { |
422 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); | 389 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); |
423 | 390 |
424 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | 391 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
425 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks()); | 392 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks()); |
426 | 393 |
427 runPendingTasks(); | 394 runPendingTasks(); |
428 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); | 395 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); |
429 | 396 |
(...skipping 18 matching lines...) Expand all Loading... | |
448 m_scheduler->setSharedTimerFireInterval(0); | 415 m_scheduler->setSharedTimerFireInterval(0); |
449 m_platformSupport.triggerSharedTimer(); | 416 m_platformSupport.triggerSharedTimer(); |
450 | 417 |
451 EXPECT_EQ(0, s_dummyTaskCount); | 418 EXPECT_EQ(0, s_dummyTaskCount); |
452 | 419 |
453 // Clean up. | 420 // Clean up. |
454 m_scheduler->stopSharedTimer(); | 421 m_scheduler->stopSharedTimer(); |
455 m_scheduler->setSharedTimerFiredFunction(nullptr); | 422 m_scheduler->setSharedTimerFiredFunction(nullptr); |
456 } | 423 } |
457 | 424 |
458 TEST_F(SchedulerTest, HighPriorityTasksOnlyRunOncePerSharedTimerFiring_InLowSche dulerPolicy) | |
459 { | |
460 s_dummyTaskCount = 0; | |
461 m_scheduler->enterSchedulerPolicy(SchedulerForTest::CompositorPriority); | |
462 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | |
463 // Trigger the posting of an input task during execution of the shared timer function. | |
464 m_scheduler->setSharedTimerFiredFunction(&postDummyInputTask); | |
465 m_scheduler->setSharedTimerFireInterval(0); | |
466 m_platformSupport.triggerSharedTimer(); | |
467 | |
468 EXPECT_EQ(1, s_dummyTaskCount); | |
469 | |
470 // Clean up. | |
471 m_scheduler->stopSharedTimer(); | |
472 m_scheduler->setSharedTimerFiredFunction(nullptr); | |
473 } | |
474 | |
475 TEST_F(SchedulerTest, TestInputEventDoesNotTriggerShouldYield_InNormalMode) | 425 TEST_F(SchedulerTest, TestInputEventDoesNotTriggerShouldYield_InNormalMode) |
476 { | 426 { |
477 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | 427 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
478 | 428 |
479 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 429 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
480 } | 430 } |
481 | 431 |
482 TEST_F(SchedulerTest, TestDidReceiveInputEventDoesNotTriggerShouldYield) | 432 TEST_F(SchedulerTest, TestDidReceiveInputEventDoesNotTriggerShouldYield) |
483 { | 433 { |
484 m_scheduler->didReceiveInputEvent(); | 434 m_scheduler->didReceiveInputEvent(); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
546 m_platformSupport.setMonotonicTimeForTest(1000.5); | 496 m_platformSupport.setMonotonicTimeForTest(1000.5); |
547 runPendingTasks(); | 497 runPendingTasks(); |
548 | 498 |
549 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 499 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
550 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); | 500 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); |
551 | 501 |
552 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 502 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
553 } | 503 } |
554 | 504 |
555 } // namespace | 505 } // namespace |
OLD | NEW |