| 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/scheduler_worker_pool_impl.h" | 5 #include "base/task_scheduler/scheduler_worker_pool_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <unordered_set> | 10 #include <unordered_set> |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 const SequenceSortKey sort_key(sequence->GetSortKey()); | 107 const SequenceSortKey sort_key(sequence->GetSortKey()); |
| 108 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); | 108 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); |
| 109 } | 109 } |
| 110 | 110 |
| 111 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); | 111 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( | 114 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( |
| 115 SchedulerWorkerPoolImpl* worker_pool, | 115 SchedulerWorkerPoolImpl* worker_pool, |
| 116 test::ExecutionMode execution_mode) { | 116 test::ExecutionMode execution_mode) { |
| 117 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. |
| 118 const TaskTraits traits = TaskTraits().WithWait(); |
| 117 switch (execution_mode) { | 119 switch (execution_mode) { |
| 118 case test::ExecutionMode::PARALLEL: | 120 case test::ExecutionMode::PARALLEL: |
| 119 return worker_pool->CreateTaskRunnerWithTraits(TaskTraits()); | 121 return worker_pool->CreateTaskRunnerWithTraits(traits); |
| 120 case test::ExecutionMode::SEQUENCED: | 122 case test::ExecutionMode::SEQUENCED: |
| 121 return worker_pool->CreateSequencedTaskRunnerWithTraits(TaskTraits()); | 123 return worker_pool->CreateSequencedTaskRunnerWithTraits(traits); |
| 122 case test::ExecutionMode::SINGLE_THREADED: | 124 case test::ExecutionMode::SINGLE_THREADED: |
| 123 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); | 125 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(traits); |
| 124 } | 126 } |
| 125 ADD_FAILURE() << "Unknown ExecutionMode"; | 127 ADD_FAILURE() << "Unknown ExecutionMode"; |
| 126 return nullptr; | 128 return nullptr; |
| 127 } | 129 } |
| 128 | 130 |
| 129 using PostNestedTask = test::TestTaskFactory::PostNestedTask; | 131 using PostNestedTask = test::TestTaskFactory::PostNestedTask; |
| 130 | 132 |
| 131 class ThreadPostingTasks : public SimpleThread { | 133 class ThreadPostingTasks : public SimpleThread { |
| 132 public: | 134 public: |
| 133 enum class WaitBeforePostTask { | 135 enum class WaitBeforePostTask { |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 }; | 536 }; |
| 535 | 537 |
| 536 } // namespace | 538 } // namespace |
| 537 | 539 |
| 538 // Checks that at least one thread has detached by checking the TLS. | 540 // Checks that at least one thread has detached by checking the TLS. |
| 539 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) { | 541 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) { |
| 540 // Saturate the threads and mark each thread with a magic TLS value. | 542 // Saturate the threads and mark each thread with a magic TLS value. |
| 541 std::vector<std::unique_ptr<test::TestTaskFactory>> factories; | 543 std::vector<std::unique_ptr<test::TestTaskFactory>> factories; |
| 542 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { | 544 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { |
| 543 factories.push_back(MakeUnique<test::TestTaskFactory>( | 545 factories.push_back(MakeUnique<test::TestTaskFactory>( |
| 544 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits()), | 546 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait()), |
| 545 test::ExecutionMode::PARALLEL)); | 547 test::ExecutionMode::PARALLEL)); |
| 546 ASSERT_TRUE(factories.back()->PostTask( | 548 ASSERT_TRUE(factories.back()->PostTask( |
| 547 PostNestedTask::NO, | 549 PostNestedTask::NO, |
| 548 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait, | 550 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait, |
| 549 Unretained(this)))); | 551 Unretained(this)))); |
| 550 factories.back()->WaitForAllTasksToRun(); | 552 factories.back()->WaitForAllTasksToRun(); |
| 551 } | 553 } |
| 552 | 554 |
| 553 // Release tasks waiting on |waiter_|. | 555 // Release tasks waiting on |waiter_|. |
| 554 waiter_.Signal(); | 556 waiter_.Signal(); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 | 607 |
| 606 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest); | 608 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest); |
| 607 }; | 609 }; |
| 608 | 610 |
| 609 } // namespace | 611 } // namespace |
| 610 | 612 |
| 611 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) { | 613 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) { |
| 612 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, | 614 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, |
| 613 WaitableEvent::InitialState::NOT_SIGNALED); | 615 WaitableEvent::InitialState::NOT_SIGNALED); |
| 614 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); | 616 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); |
| 615 auto task_runner = | 617 auto task_runner = worker_pool_->CreateSequencedTaskRunnerWithTraits( |
| 616 worker_pool_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); | 618 TaskTraits().WithWait()); |
| 617 | 619 |
| 618 // Post a task. | 620 // Post a task. |
| 619 task_runner->PostTask(FROM_HERE, | 621 task_runner->PostTask(FROM_HERE, |
| 620 Bind(&WaitableEvent::Wait, Unretained(&event))); | 622 Bind(&WaitableEvent::Wait, Unretained(&event))); |
| 621 | 623 |
| 622 // Post 2 more tasks while the first task hasn't completed its execution. It | 624 // Post 2 more tasks while the first task hasn't completed its execution. It |
| 623 // is guaranteed that these tasks will run immediately after the first task, | 625 // is guaranteed that these tasks will run immediately after the first task, |
| 624 // without allowing the worker to sleep. | 626 // without allowing the worker to sleep. |
| 625 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); | 627 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); |
| 626 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); | 628 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 649 signal_event->Signal(); | 651 signal_event->Signal(); |
| 650 wait_event->Wait(); | 652 wait_event->Wait(); |
| 651 } | 653 } |
| 652 | 654 |
| 653 } // namespace | 655 } // namespace |
| 654 | 656 |
| 655 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) { | 657 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) { |
| 656 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL, | 658 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL, |
| 657 WaitableEvent::InitialState::NOT_SIGNALED); | 659 WaitableEvent::InitialState::NOT_SIGNALED); |
| 658 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool); | 660 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool); |
| 659 auto task_runner = worker_pool_->CreateTaskRunnerWithTraits(TaskTraits()); | 661 auto task_runner = |
| 662 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait()); |
| 660 | 663 |
| 661 // Post tasks to saturate the pool. | 664 // Post tasks to saturate the pool. |
| 662 std::vector<std::unique_ptr<WaitableEvent>> task_started_events; | 665 std::vector<std::unique_ptr<WaitableEvent>> task_started_events; |
| 663 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { | 666 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { |
| 664 task_started_events.push_back( | 667 task_started_events.push_back( |
| 665 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL, | 668 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL, |
| 666 WaitableEvent::InitialState::NOT_SIGNALED)); | 669 WaitableEvent::InitialState::NOT_SIGNALED)); |
| 667 task_runner->PostTask( | 670 task_runner->PostTask( |
| 668 FROM_HERE, | 671 FROM_HERE, |
| 669 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()), | 672 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()), |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), | 796 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), |
| 794 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | 797 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 795 &delayed_task_manager); | 798 &delayed_task_manager); |
| 796 ASSERT_TRUE(worker_pool); | 799 ASSERT_TRUE(worker_pool); |
| 797 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); | 800 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 798 worker_pool->JoinForTesting(); | 801 worker_pool->JoinForTesting(); |
| 799 } | 802 } |
| 800 | 803 |
| 801 } // namespace internal | 804 } // namespace internal |
| 802 } // namespace base | 805 } // namespace base |
| OLD | NEW |