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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_selector_unittest.cc

Issue 2786083005: scheduler: Maintain a constant enqueue order for every task (Closed)
Patch Set: WASM workaround no longer needed 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "platform/scheduler/base/task_queue_selector.h" 5 #include "platform/scheduler/base/task_queue_selector.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 } 59 }
60 WorkQueueSets* immediate_work_queue_sets() { 60 WorkQueueSets* immediate_work_queue_sets() {
61 return enabled_selector()->immediate_work_queue_sets(); 61 return enabled_selector()->immediate_work_queue_sets();
62 } 62 }
63 63
64 void PushTasks(const size_t queue_indices[], size_t num_tasks) { 64 void PushTasks(const size_t queue_indices[], size_t num_tasks) {
65 std::set<size_t> changed_queue_set; 65 std::set<size_t> changed_queue_set;
66 for (size_t i = 0; i < num_tasks; i++) { 66 for (size_t i = 0; i < num_tasks; i++) {
67 changed_queue_set.insert(queue_indices[i]); 67 changed_queue_set.insert(queue_indices[i]);
68 task_queues_[queue_indices[i]]->immediate_work_queue()->Push( 68 task_queues_[queue_indices[i]]->immediate_work_queue()->Push(
69 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), 0, 69 TaskQueueImpl::Task(FROM_HERE, test_closure_, {base::TimeTicks(), i},
70 true, i)); 70 true));
71 } 71 }
72 } 72 }
73 73
74 void PushTasksWithEnqueueOrder(const size_t queue_indices[], 74 void PushTasksWithEnqueueOrder(const size_t queue_indices[],
75 const size_t enqueue_orders[], 75 const size_t enqueue_orders[],
76 size_t num_tasks) { 76 size_t num_tasks) {
77 std::set<size_t> changed_queue_set; 77 std::set<size_t> changed_queue_set;
78 for (size_t i = 0; i < num_tasks; i++) { 78 for (size_t i = 0; i < num_tasks; i++) {
79 changed_queue_set.insert(queue_indices[i]); 79 changed_queue_set.insert(queue_indices[i]);
80 task_queues_[queue_indices[i]]->immediate_work_queue()->Push( 80 task_queues_[queue_indices[i]]->immediate_work_queue()->Push(
81 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), 0, 81 TaskQueueImpl::Task(FROM_HERE, test_closure_,
82 true, enqueue_orders[i])); 82 {base::TimeTicks(), enqueue_orders[i]}, true));
83 } 83 }
84 } 84 }
85 85
86 std::vector<size_t> PopTasks() { 86 std::vector<size_t> PopTasks() {
87 std::vector<size_t> order; 87 std::vector<size_t> order;
88 WorkQueue* chosen_work_queue; 88 WorkQueue* chosen_work_queue;
89 while (selector_.SelectWorkQueueToService(&chosen_work_queue)) { 89 while (selector_.SelectWorkQueueToService(&chosen_work_queue)) {
90 size_t chosen_queue_index = 90 size_t chosen_queue_index =
91 queue_to_index_map_.find(chosen_work_queue->task_queue())->second; 91 queue_to_index_map_.find(chosen_work_queue->task_queue())->second;
92 order.push_back(chosen_queue_index); 92 order.push_back(chosen_queue_index);
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_Empty) { 371 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_Empty) {
372 WorkQueue* chosen_work_queue = nullptr; 372 WorkQueue* chosen_work_queue = nullptr;
373 bool chose_delayed_over_immediate = false; 373 bool chose_delayed_over_immediate = false;
374 EXPECT_FALSE(enabled_selector()->ChooseOldestWithPriority( 374 EXPECT_FALSE(enabled_selector()->ChooseOldestWithPriority(
375 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate, 375 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate,
376 &chosen_work_queue)); 376 &chosen_work_queue));
377 EXPECT_FALSE(chose_delayed_over_immediate); 377 EXPECT_FALSE(chose_delayed_over_immediate);
378 } 378 }
379 379
380 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) { 380 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) {
381 task_queues_[0]->delayed_work_queue()->Push(TaskQueueImpl::Task( 381 task_queues_[0]->delayed_work_queue()->Push(
382 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); 382 TaskQueueImpl::Task(FROM_HERE, test_closure_, EnqueueOrder(), true));
383 383
384 WorkQueue* chosen_work_queue = nullptr; 384 WorkQueue* chosen_work_queue = nullptr;
385 bool chose_delayed_over_immediate = false; 385 bool chose_delayed_over_immediate = false;
386 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority( 386 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority(
387 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate, 387 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate,
388 &chosen_work_queue)); 388 &chosen_work_queue));
389 EXPECT_EQ(chosen_work_queue, task_queues_[0]->delayed_work_queue()); 389 EXPECT_EQ(chosen_work_queue, task_queues_[0]->delayed_work_queue());
390 EXPECT_FALSE(chose_delayed_over_immediate); 390 EXPECT_FALSE(chose_delayed_over_immediate);
391 } 391 }
392 392
393 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) { 393 TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) {
394 task_queues_[0]->immediate_work_queue()->Push(TaskQueueImpl::Task( 394 task_queues_[0]->immediate_work_queue()->Push(
395 FROM_HERE, test_closure_, base::TimeTicks(), 0, true, 0)); 395 TaskQueueImpl::Task(FROM_HERE, test_closure_, EnqueueOrder(), true));
396 396
397 WorkQueue* chosen_work_queue = nullptr; 397 WorkQueue* chosen_work_queue = nullptr;
398 bool chose_delayed_over_immediate = false; 398 bool chose_delayed_over_immediate = false;
399 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority( 399 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority(
400 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate, 400 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate,
401 &chosen_work_queue)); 401 &chosen_work_queue));
402 EXPECT_EQ(chosen_work_queue, task_queues_[0]->immediate_work_queue()); 402 EXPECT_EQ(chosen_work_queue, task_queues_[0]->immediate_work_queue());
403 EXPECT_FALSE(chose_delayed_over_immediate); 403 EXPECT_FALSE(chose_delayed_over_immediate);
404 } 404 }
405 405
406 TEST_F(TaskQueueSelectorTest, TestObserverWithOneBlockedQueue) { 406 TEST_F(TaskQueueSelectorTest, TestObserverWithOneBlockedQueue) {
407 TaskQueueSelectorForTest selector; 407 TaskQueueSelectorForTest selector;
408 MockObserver mock_observer; 408 MockObserver mock_observer;
409 selector.SetTaskQueueSelectorObserver(&mock_observer); 409 selector.SetTaskQueueSelectorObserver(&mock_observer);
410 410
411 EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1); 411 EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(1);
412 412
413 scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting()); 413 scoped_refptr<TaskQueueImpl> task_queue(NewTaskQueueWithBlockReporting());
414 selector.AddQueue(task_queue.get()); 414 selector.AddQueue(task_queue.get());
415 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter = 415 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter =
416 task_queue->CreateQueueEnabledVoter(); 416 task_queue->CreateQueueEnabledVoter();
417 417
418 voter->SetQueueEnabled(false); 418 voter->SetQueueEnabled(false);
419 selector.DisableQueue(task_queue.get()); 419 selector.DisableQueue(task_queue.get());
420 420
421 TaskQueueImpl::Task task(FROM_HERE, test_closure_, base::TimeTicks(), 0, 421 TaskQueueImpl::Task task(FROM_HERE, test_closure_, EnqueueOrder(), true);
422 true);
423 task.set_enqueue_order(0);
424 task_queue->immediate_work_queue()->Push(std::move(task)); 422 task_queue->immediate_work_queue()->Push(std::move(task));
425 423
426 WorkQueue* chosen_work_queue; 424 WorkQueue* chosen_work_queue;
427 EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1); 425 EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1);
428 EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); 426 EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue));
429 427
430 voter.reset(); 428 voter.reset();
431 selector.EnableQueue(task_queue.get()); 429 selector.EnableQueue(task_queue.get());
432 task_queue->UnregisterTaskQueue(); 430 task_queue->UnregisterTaskQueue();
433 selector.RemoveQueue(task_queue.get()); 431 selector.RemoveQueue(task_queue.get());
(...skipping 13 matching lines...) Expand all
447 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 = 445 std::unique_ptr<TaskQueue::QueueEnabledVoter> voter2 =
448 task_queue2->CreateQueueEnabledVoter(); 446 task_queue2->CreateQueueEnabledVoter();
449 447
450 voter->SetQueueEnabled(false); 448 voter->SetQueueEnabled(false);
451 voter2->SetQueueEnabled(false); 449 voter2->SetQueueEnabled(false);
452 selector.DisableQueue(task_queue.get()); 450 selector.DisableQueue(task_queue.get());
453 selector.DisableQueue(task_queue2.get()); 451 selector.DisableQueue(task_queue2.get());
454 452
455 selector.SetQueuePriority(task_queue2.get(), TaskQueue::CONTROL_PRIORITY); 453 selector.SetQueuePriority(task_queue2.get(), TaskQueue::CONTROL_PRIORITY);
456 454
457 TaskQueueImpl::Task task1(FROM_HERE, test_closure_, base::TimeTicks(), 0, 455 TaskQueueImpl::Task task1(FROM_HERE, test_closure_, EnqueueOrder(), true);
456 TaskQueueImpl::Task task2(FROM_HERE, test_closure_, {base::TimeTicks(), 1},
458 true); 457 true);
459 TaskQueueImpl::Task task2(FROM_HERE, test_closure_, base::TimeTicks(), 1,
460 true);
461 task1.set_enqueue_order(0);
462 task2.set_enqueue_order(1);
463 task_queue->immediate_work_queue()->Push(std::move(task1)); 458 task_queue->immediate_work_queue()->Push(std::move(task1));
464 task_queue2->immediate_work_queue()->Push(std::move(task2)); 459 task_queue2->immediate_work_queue()->Push(std::move(task2));
465 460
466 // Should still only see one call to OnTriedToSelectBlockedWorkQueue. 461 // Should still only see one call to OnTriedToSelectBlockedWorkQueue.
467 WorkQueue* chosen_work_queue; 462 WorkQueue* chosen_work_queue;
468 EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1); 463 EXPECT_CALL(mock_observer, OnTriedToSelectBlockedWorkQueue(_)).Times(1);
469 EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue)); 464 EXPECT_FALSE(selector.SelectWorkQueueToService(&chosen_work_queue));
470 testing::Mock::VerifyAndClearExpectations(&mock_observer); 465 testing::Mock::VerifyAndClearExpectations(&mock_observer);
471 466
472 EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2); 467 EXPECT_CALL(mock_observer, OnTaskQueueEnabled(_)).Times(2);
(...skipping 28 matching lines...) Expand all
501 {1, 2, 2, "delayed", true}, {1, 2, 3, "immediate", false}, 496 {1, 2, 2, "delayed", true}, {1, 2, 3, "immediate", false},
502 {1, 2, 4, "immediate", false}, {2, 1, 4, "immediate", false}, 497 {1, 2, 4, "immediate", false}, {2, 1, 4, "immediate", false},
503 {2, 1, 4, "immediate", false}, 498 {2, 1, 4, "immediate", false},
504 }; 499 };
505 500
506 class ChooseOldestWithPriorityTest 501 class ChooseOldestWithPriorityTest
507 : public TaskQueueSelectorTest, 502 : public TaskQueueSelectorTest,
508 public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {}; 503 public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {};
509 504
510 TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) { 505 TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) {
511 task_queues_[0]->immediate_work_queue()->Push( 506 task_queues_[0]->immediate_work_queue()->Push(TaskQueueImpl::Task(
512 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), 507 FROM_HERE, test_closure_,
513 GetParam().immediate_task_enqueue_order, true, 508 {base::TimeTicks(), GetParam().immediate_task_enqueue_order}, true));
514 GetParam().immediate_task_enqueue_order));
515 509
516 task_queues_[0]->delayed_work_queue()->Push( 510 task_queues_[0]->delayed_work_queue()->Push(TaskQueueImpl::Task(
517 TaskQueueImpl::Task(FROM_HERE, test_closure_, base::TimeTicks(), 511 FROM_HERE, test_closure_,
518 GetParam().delayed_task_enqueue_order, true, 512 {base::TimeTicks(), GetParam().delayed_task_enqueue_order}, true));
519 GetParam().delayed_task_enqueue_order));
520 513
521 selector_.SetImmediateStarvationCountForTest( 514 selector_.SetImmediateStarvationCountForTest(
522 GetParam().immediate_starvation_count); 515 GetParam().immediate_starvation_count);
523 516
524 WorkQueue* chosen_work_queue = nullptr; 517 WorkQueue* chosen_work_queue = nullptr;
525 bool chose_delayed_over_immediate = false; 518 bool chose_delayed_over_immediate = false;
526 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority( 519 EXPECT_TRUE(enabled_selector()->ChooseOldestWithPriority(
527 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate, 520 TaskQueue::NORMAL_PRIORITY, &chose_delayed_over_immediate,
528 &chosen_work_queue)); 521 &chosen_work_queue));
529 EXPECT_EQ(chosen_work_queue->task_queue(), task_queues_[0].get()); 522 EXPECT_EQ(chosen_work_queue->task_queue(), task_queues_[0].get());
530 EXPECT_STREQ(chosen_work_queue->GetName(), 523 EXPECT_STREQ(chosen_work_queue->GetName(),
531 GetParam().expected_work_queue_name); 524 GetParam().expected_work_queue_name);
532 EXPECT_EQ(chose_delayed_over_immediate, 525 EXPECT_EQ(chose_delayed_over_immediate,
533 GetParam().expected_did_starve_immediate_queue); 526 GetParam().expected_did_starve_immediate_queue);
534 } 527 }
535 528
536 INSTANTIATE_TEST_CASE_P(ChooseOldestWithPriorityTest, 529 INSTANTIATE_TEST_CASE_P(ChooseOldestWithPriorityTest,
537 ChooseOldestWithPriorityTest, 530 ChooseOldestWithPriorityTest,
538 testing::ValuesIn(kChooseOldestWithPriorityTestCases)); 531 testing::ValuesIn(kChooseOldestWithPriorityTestCases));
539 532
540 } // namespace internal 533 } // namespace internal
541 } // namespace scheduler 534 } // namespace scheduler
542 } // namespace blink 535 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698