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(); |
| 338 EXPECT_TRUE(m_order.empty()); |
352 | 339 |
353 EXPECT_THAT(m_reentrantOrder, testing::ElementsAre(0, 1, 2, 3, 4)); | 340 runPendingTasks(); |
354 } | 341 EXPECT_THAT(m_order, testing::ElementsAre( |
355 | 342 std::string("1"), std::string("2"), std::string("3"), std::string("4")))
; |
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 } | 343 } |
363 | 344 |
364 bool s_shouldContinue; | 345 bool s_shouldContinue; |
365 void reentrantInputTask(Scheduler* scheduler) | 346 void reentrantInputTask(Scheduler* scheduler) |
366 { | 347 { |
367 if (s_shouldContinue) | 348 if (s_shouldContinue) |
368 scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, sched
uler)); | 349 scheduler->postInputTask(FROM_HERE, WTF::bind(&reentrantInputTask, sched
uler)); |
369 } | 350 } |
370 | 351 |
371 void reentrantCompositorTask(Scheduler* scheduler) | 352 void reentrantCompositorTask(Scheduler* scheduler) |
(...skipping 26 matching lines...) Expand all Loading... |
398 // If starvation occurs then this will never exit. | 379 // If starvation occurs then this will never exit. |
399 runPendingTasks(); | 380 runPendingTasks(); |
400 } | 381 } |
401 | 382 |
402 int s_dummyTaskCount; | 383 int s_dummyTaskCount; |
403 void dummyTask() | 384 void dummyTask() |
404 { | 385 { |
405 s_dummyTaskCount++; | 386 s_dummyTaskCount++; |
406 } | 387 } |
407 | 388 |
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) | 389 TEST_F(SchedulerTest, TestMainThreadTaskLifeCycle) |
421 { | 390 { |
422 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); | 391 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); |
423 | 392 |
424 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | 393 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
425 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks()); | 394 EXPECT_EQ(1U, m_platformSupport.numPendingMainThreadTasks()); |
426 | 395 |
427 runPendingTasks(); | 396 runPendingTasks(); |
428 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); | 397 EXPECT_EQ(0U, m_platformSupport.numPendingMainThreadTasks()); |
429 | 398 |
(...skipping 18 matching lines...) Expand all Loading... |
448 m_scheduler->setSharedTimerFireInterval(0); | 417 m_scheduler->setSharedTimerFireInterval(0); |
449 m_platformSupport.triggerSharedTimer(); | 418 m_platformSupport.triggerSharedTimer(); |
450 | 419 |
451 EXPECT_EQ(0, s_dummyTaskCount); | 420 EXPECT_EQ(0, s_dummyTaskCount); |
452 | 421 |
453 // Clean up. | 422 // Clean up. |
454 m_scheduler->stopSharedTimer(); | 423 m_scheduler->stopSharedTimer(); |
455 m_scheduler->setSharedTimerFiredFunction(nullptr); | 424 m_scheduler->setSharedTimerFiredFunction(nullptr); |
456 } | 425 } |
457 | 426 |
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) | 427 TEST_F(SchedulerTest, TestInputEventDoesNotTriggerShouldYield_InNormalMode) |
476 { | 428 { |
477 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); | 429 m_scheduler->postInputTask(FROM_HERE, WTF::bind(&dummyTask)); |
478 | 430 |
479 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 431 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
480 } | 432 } |
481 | 433 |
482 TEST_F(SchedulerTest, TestDidReceiveInputEventDoesNotTriggerShouldYield) | 434 TEST_F(SchedulerTest, TestDidReceiveInputEventDoesNotTriggerShouldYield) |
483 { | 435 { |
484 m_scheduler->didReceiveInputEvent(); | 436 m_scheduler->didReceiveInputEvent(); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 m_platformSupport.setMonotonicTimeForTest(1000.5); | 498 m_platformSupport.setMonotonicTimeForTest(1000.5); |
547 runPendingTasks(); | 499 runPendingTasks(); |
548 | 500 |
549 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 501 ASSERT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
550 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); | 502 m_scheduler->postCompositorTask(FROM_HERE, WTF::bind(&dummyTask)); |
551 | 503 |
552 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); | 504 EXPECT_FALSE(m_scheduler->shouldYieldForHighPriorityWork()); |
553 } | 505 } |
554 | 506 |
555 } // namespace | 507 } // namespace |
OLD | NEW |