| 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 } | 71 } |
| 72 | 72 |
| 73 void TearDown() override { | 73 void TearDown() override { |
| 74 service_thread_.Stop(); | 74 service_thread_.Stop(); |
| 75 worker_pool_->WaitForAllWorkersIdleForTesting(); | 75 worker_pool_->WaitForAllWorkersIdleForTesting(); |
| 76 worker_pool_->JoinForTesting(); | 76 worker_pool_->JoinForTesting(); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void CreateWorkerPool() { | 79 void CreateWorkerPool() { |
| 80 ASSERT_FALSE(worker_pool_); | 80 ASSERT_FALSE(worker_pool_); |
| 81 ASSERT_FALSE(delayed_task_manager_); | |
| 82 service_thread_.Start(); | 81 service_thread_.Start(); |
| 83 delayed_task_manager_ = | 82 delayed_task_manager_.Start(service_thread_.task_runner()); |
| 84 base::MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); | |
| 85 worker_pool_ = MakeUnique<SchedulerWorkerPoolImpl>( | 83 worker_pool_ = MakeUnique<SchedulerWorkerPoolImpl>( |
| 86 "TestWorkerPool", ThreadPriority::NORMAL, | 84 "TestWorkerPool", ThreadPriority::NORMAL, |
| 87 Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, | 85 Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, |
| 88 Unretained(this)), | 86 Unretained(this)), |
| 89 &task_tracker_, delayed_task_manager_.get()); | 87 &task_tracker_, &delayed_task_manager_); |
| 90 ASSERT_TRUE(worker_pool_); | 88 ASSERT_TRUE(worker_pool_); |
| 91 } | 89 } |
| 92 | 90 |
| 93 void StartWorkerPool(TimeDelta suggested_reclaim_time, size_t num_workers) { | 91 void StartWorkerPool(TimeDelta suggested_reclaim_time, size_t num_workers) { |
| 94 ASSERT_TRUE(worker_pool_); | 92 ASSERT_TRUE(worker_pool_); |
| 95 worker_pool_->Start(SchedulerWorkerPoolParams( | 93 worker_pool_->Start(SchedulerWorkerPoolParams( |
| 96 "TestWorkerPool", ThreadPriority::NORMAL, StandbyThreadPolicy::LAZY, | 94 "TestWorkerPool", ThreadPriority::NORMAL, StandbyThreadPolicy::LAZY, |
| 97 num_workers, suggested_reclaim_time)); | 95 num_workers, suggested_reclaim_time)); |
| 98 } | 96 } |
| 99 | 97 |
| 100 void CreateAndStartWorkerPool(TimeDelta suggested_reclaim_time, | 98 void CreateAndStartWorkerPool(TimeDelta suggested_reclaim_time, |
| 101 size_t num_workers) { | 99 size_t num_workers) { |
| 102 CreateWorkerPool(); | 100 CreateWorkerPool(); |
| 103 StartWorkerPool(suggested_reclaim_time, num_workers); | 101 StartWorkerPool(suggested_reclaim_time, num_workers); |
| 104 } | 102 } |
| 105 | 103 |
| 106 std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_; | 104 std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_; |
| 107 | 105 |
| 108 TaskTracker task_tracker_; | 106 TaskTracker task_tracker_; |
| 109 Thread service_thread_; | 107 Thread service_thread_; |
| 110 std::unique_ptr<DelayedTaskManager> delayed_task_manager_; | |
| 111 | 108 |
| 112 private: | 109 private: |
| 113 void ReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { | 110 void ReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { |
| 114 // In production code, this callback would be implemented by the | 111 // In production code, this callback would be implemented by the |
| 115 // TaskScheduler which would first determine which PriorityQueue the | 112 // TaskScheduler which would first determine which PriorityQueue the |
| 116 // sequence must be re-enqueued. | 113 // sequence must be re-enqueued. |
| 117 const SequenceSortKey sort_key(sequence->GetSortKey()); | 114 const SequenceSortKey sort_key(sequence->GetSortKey()); |
| 118 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); | 115 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); |
| 119 } | 116 } |
| 120 | 117 |
| 118 DelayedTaskManager delayed_task_manager_; |
| 119 |
| 121 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); | 120 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); |
| 122 }; | 121 }; |
| 123 | 122 |
| 124 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( | 123 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( |
| 125 SchedulerWorkerPoolImpl* worker_pool, | 124 SchedulerWorkerPoolImpl* worker_pool, |
| 126 test::ExecutionMode execution_mode) { | 125 test::ExecutionMode execution_mode) { |
| 127 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. | 126 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. |
| 128 const TaskTraits traits = TaskTraits().WithBaseSyncPrimitives(); | 127 const TaskTraits traits = TaskTraits().WithBaseSyncPrimitives(); |
| 129 switch (execution_mode) { | 128 switch (execution_mode) { |
| 130 case test::ExecutionMode::PARALLEL: | 129 case test::ExecutionMode::PARALLEL: |
| (...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 786 | 785 |
| 787 void NotReachedReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { | 786 void NotReachedReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { |
| 788 ADD_FAILURE() | 787 ADD_FAILURE() |
| 789 << "Unexpected invocation of NotReachedReEnqueueSequenceCallback."; | 788 << "Unexpected invocation of NotReachedReEnqueueSequenceCallback."; |
| 790 } | 789 } |
| 791 | 790 |
| 792 } // namespace | 791 } // namespace |
| 793 | 792 |
| 794 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitLazy) { | 793 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitLazy) { |
| 795 TaskTracker task_tracker; | 794 TaskTracker task_tracker; |
| 796 DelayedTaskManager delayed_task_manager( | 795 DelayedTaskManager delayed_task_manager; |
| 797 make_scoped_refptr(new TestSimpleTaskRunner)); | 796 delayed_task_manager.Start(make_scoped_refptr(new TestSimpleTaskRunner)); |
| 798 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( | 797 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( |
| 799 "LazyPolicyWorkerPool", ThreadPriority::NORMAL, | 798 "LazyPolicyWorkerPool", ThreadPriority::NORMAL, |
| 800 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | 799 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 801 &delayed_task_manager); | 800 &delayed_task_manager); |
| 802 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::LAZY, 8U, | 801 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::LAZY, 8U, |
| 803 TimeDelta::Max())); | 802 TimeDelta::Max())); |
| 804 ASSERT_TRUE(worker_pool); | 803 ASSERT_TRUE(worker_pool); |
| 805 EXPECT_EQ(0U, worker_pool->NumberOfAliveWorkersForTesting()); | 804 EXPECT_EQ(0U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 806 worker_pool->JoinForTesting(); | 805 worker_pool->JoinForTesting(); |
| 807 } | 806 } |
| 808 | 807 |
| 809 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) { | 808 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) { |
| 810 TaskTracker task_tracker; | 809 TaskTracker task_tracker; |
| 811 DelayedTaskManager delayed_task_manager( | 810 DelayedTaskManager delayed_task_manager; |
| 812 make_scoped_refptr(new TestSimpleTaskRunner)); | 811 delayed_task_manager.Start(make_scoped_refptr(new TestSimpleTaskRunner)); |
| 813 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( | 812 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( |
| 814 "OnePolicyWorkerPool", ThreadPriority::NORMAL, | 813 "OnePolicyWorkerPool", ThreadPriority::NORMAL, |
| 815 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | 814 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 816 &delayed_task_manager); | 815 &delayed_task_manager); |
| 817 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::ONE, 8U, | 816 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::ONE, 8U, |
| 818 TimeDelta::Max())); | 817 TimeDelta::Max())); |
| 819 ASSERT_TRUE(worker_pool); | 818 ASSERT_TRUE(worker_pool); |
| 820 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); | 819 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 821 worker_pool->JoinForTesting(); | 820 worker_pool->JoinForTesting(); |
| 822 } | 821 } |
| 823 | 822 |
| 824 } // namespace internal | 823 } // namespace internal |
| 825 } // namespace base | 824 } // namespace base |
| OLD | NEW |