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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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_); | 81 ASSERT_FALSE(delayed_task_manager_); |
82 service_thread_.Start(); | 82 service_thread_.Start(); |
83 delayed_task_manager_ = | 83 delayed_task_manager_ = |
84 base::MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); | 84 base::MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); |
85 worker_pool_ = MakeUnique<SchedulerWorkerPoolImpl>( | 85 worker_pool_ = MakeUnique<SchedulerWorkerPoolImpl>( |
86 "TestWorkerPool", ThreadPriority::NORMAL, | 86 "TestWorkerPool", ThreadPriority::NORMAL, |
87 Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, | |
88 Unretained(this)), | |
89 &task_tracker_, delayed_task_manager_.get()); | 87 &task_tracker_, delayed_task_manager_.get()); |
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_; | 108 std::unique_ptr<DelayedTaskManager> delayed_task_manager_; |
111 | 109 |
112 private: | 110 private: |
113 void ReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { | |
114 // In production code, this callback would be implemented by the | |
115 // TaskScheduler which would first determine which PriorityQueue the | |
116 // sequence must be re-enqueued. | |
117 const SequenceSortKey sort_key(sequence->GetSortKey()); | |
118 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); | |
119 } | |
120 | |
121 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); | 111 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); |
122 }; | 112 }; |
123 | 113 |
124 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( | 114 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( |
125 SchedulerWorkerPoolImpl* worker_pool, | 115 SchedulerWorkerPoolImpl* worker_pool, |
126 test::ExecutionMode execution_mode) { | 116 test::ExecutionMode execution_mode) { |
127 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. | 117 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. |
128 const TaskTraits traits = TaskTraits().WithBaseSyncPrimitives(); | 118 const TaskTraits traits = TaskTraits().WithBaseSyncPrimitives(); |
129 switch (execution_mode) { | 119 switch (execution_mode) { |
130 case test::ExecutionMode::PARALLEL: | 120 case test::ExecutionMode::PARALLEL: |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); | 764 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); |
775 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(1)); | 765 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(1)); |
776 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(2)); | 766 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(2)); |
777 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); | 767 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); |
778 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(4)); | 768 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(4)); |
779 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(5)); | 769 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(5)); |
780 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(6)); | 770 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(6)); |
781 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); | 771 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); |
782 } | 772 } |
783 | 773 |
784 namespace { | |
785 | |
786 void NotReachedReEnqueueSequenceCallback(scoped_refptr<Sequence> sequence) { | |
787 ADD_FAILURE() | |
788 << "Unexpected invocation of NotReachedReEnqueueSequenceCallback."; | |
789 } | |
790 | |
791 } // namespace | |
792 | |
793 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitLazy) { | 774 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitLazy) { |
794 TaskTracker task_tracker; | 775 TaskTracker task_tracker; |
795 DelayedTaskManager delayed_task_manager( | 776 DelayedTaskManager delayed_task_manager( |
796 make_scoped_refptr(new TestSimpleTaskRunner)); | 777 make_scoped_refptr(new TestSimpleTaskRunner)); |
797 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( | 778 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( |
798 "LazyPolicyWorkerPool", ThreadPriority::NORMAL, | 779 "LazyPolicyWorkerPool", ThreadPriority::NORMAL, &task_tracker, |
799 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | |
800 &delayed_task_manager); | 780 &delayed_task_manager); |
801 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::LAZY, 8U, | 781 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::LAZY, 8U, |
802 TimeDelta::Max())); | 782 TimeDelta::Max())); |
803 ASSERT_TRUE(worker_pool); | 783 ASSERT_TRUE(worker_pool); |
804 EXPECT_EQ(0U, worker_pool->NumberOfAliveWorkersForTesting()); | 784 EXPECT_EQ(0U, worker_pool->NumberOfAliveWorkersForTesting()); |
805 worker_pool->JoinForTesting(); | 785 worker_pool->JoinForTesting(); |
806 } | 786 } |
807 | 787 |
808 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) { | 788 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) { |
809 TaskTracker task_tracker; | 789 TaskTracker task_tracker; |
810 DelayedTaskManager delayed_task_manager( | 790 DelayedTaskManager delayed_task_manager( |
811 make_scoped_refptr(new TestSimpleTaskRunner)); | 791 make_scoped_refptr(new TestSimpleTaskRunner)); |
812 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( | 792 auto worker_pool = MakeUnique<SchedulerWorkerPoolImpl>( |
813 "OnePolicyWorkerPool", ThreadPriority::NORMAL, | 793 "OnePolicyWorkerPool", ThreadPriority::NORMAL, &task_tracker, |
814 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | |
815 &delayed_task_manager); | 794 &delayed_task_manager); |
816 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::ONE, 8U, | 795 worker_pool->Start(SchedulerWorkerPoolParams(StandbyThreadPolicy::ONE, 8U, |
817 TimeDelta::Max())); | 796 TimeDelta::Max())); |
818 ASSERT_TRUE(worker_pool); | 797 ASSERT_TRUE(worker_pool); |
819 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); | 798 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); |
820 worker_pool->JoinForTesting(); | 799 worker_pool->JoinForTesting(); |
821 } | 800 } |
822 | 801 |
823 } // namespace internal | 802 } // namespace internal |
824 } // namespace base | 803 } // namespace base |
OLD | NEW |