| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 constexpr size_t kNumTasksPostedPerThread = 150; | 52 constexpr size_t kNumTasksPostedPerThread = 150; |
| 53 // This can't be lower because Windows' WaitableEvent wakes up too early when a | 53 // This can't be lower because Windows' WaitableEvent wakes up too early when a |
| 54 // small timeout is used. This results in many spurious wake ups before a worker | 54 // small timeout is used. This results in many spurious wake ups before a worker |
| 55 // is allowed to detach. | 55 // is allowed to detach. |
| 56 constexpr TimeDelta kReclaimTimeForDetachTests = | 56 constexpr TimeDelta kReclaimTimeForDetachTests = |
| 57 TimeDelta::FromMilliseconds(500); | 57 TimeDelta::FromMilliseconds(500); |
| 58 constexpr TimeDelta kExtraTimeToWaitForDetach = | 58 constexpr TimeDelta kExtraTimeToWaitForDetach = |
| 59 TimeDelta::FromSeconds(1); | 59 TimeDelta::FromSeconds(1); |
| 60 | 60 |
| 61 using IORestriction = SchedulerWorkerPoolParams::IORestriction; | 61 using IORestriction = SchedulerWorkerPoolParams::IORestriction; |
| 62 using StandbyThreadPolicy = SchedulerWorkerPoolParams::StandbyThreadPolicy; |
| 62 | 63 |
| 63 class TaskSchedulerWorkerPoolImplTest | 64 class TaskSchedulerWorkerPoolImplTest |
| 64 : public testing::TestWithParam<test::ExecutionMode> { | 65 : public testing::TestWithParam<test::ExecutionMode> { |
| 65 protected: | 66 protected: |
| 66 TaskSchedulerWorkerPoolImplTest() | 67 TaskSchedulerWorkerPoolImplTest() |
| 67 : service_thread_("TaskSchedulerServiceThread") {} | 68 : service_thread_("TaskSchedulerServiceThread") {} |
| 68 | 69 |
| 69 void SetUp() override { | 70 void SetUp() override { |
| 70 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); | 71 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); |
| 71 } | 72 } |
| 72 | 73 |
| 73 void TearDown() override { | 74 void TearDown() override { |
| 74 service_thread_.Stop(); | 75 service_thread_.Stop(); |
| 75 worker_pool_->WaitForAllWorkersIdleForTesting(); | 76 worker_pool_->WaitForAllWorkersIdleForTesting(); |
| 76 worker_pool_->JoinForTesting(); | 77 worker_pool_->JoinForTesting(); |
| 77 } | 78 } |
| 78 | 79 |
| 79 void InitializeWorkerPool(const TimeDelta& suggested_reclaim_time, | 80 void InitializeWorkerPool(const TimeDelta& suggested_reclaim_time, |
| 80 size_t num_workers) { | 81 size_t num_workers) { |
| 81 ASSERT_FALSE(worker_pool_); | 82 ASSERT_FALSE(worker_pool_); |
| 82 ASSERT_FALSE(delayed_task_manager_); | 83 ASSERT_FALSE(delayed_task_manager_); |
| 83 service_thread_.Start(); | 84 service_thread_.Start(); |
| 84 delayed_task_manager_ = | 85 delayed_task_manager_ = |
| 85 base::MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); | 86 base::MakeUnique<DelayedTaskManager>(service_thread_.task_runner()); |
| 86 worker_pool_ = SchedulerWorkerPoolImpl::Create( | 87 worker_pool_ = SchedulerWorkerPoolImpl::Create( |
| 87 SchedulerWorkerPoolParams("TestWorkerPool", ThreadPriority::NORMAL, | 88 SchedulerWorkerPoolParams( |
| 88 IORestriction::ALLOWED, num_workers, | 89 "TestWorkerPool", ThreadPriority::NORMAL, IORestriction::ALLOWED, |
| 89 suggested_reclaim_time), | 90 StandbyThreadPolicy::LAZY, num_workers, suggested_reclaim_time), |
| 90 Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, | 91 Bind(&TaskSchedulerWorkerPoolImplTest::ReEnqueueSequenceCallback, |
| 91 Unretained(this)), | 92 Unretained(this)), |
| 92 &task_tracker_, delayed_task_manager_.get()); | 93 &task_tracker_, delayed_task_manager_.get()); |
| 93 ASSERT_TRUE(worker_pool_); | 94 ASSERT_TRUE(worker_pool_); |
| 94 } | 95 } |
| 95 | 96 |
| 96 std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_; | 97 std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_; |
| 97 | 98 |
| 98 TaskTracker task_tracker_; | 99 TaskTracker task_tracker_; |
| 99 Thread service_thread_; | 100 Thread service_thread_; |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 }; | 467 }; |
| 467 | 468 |
| 468 } // namespace | 469 } // namespace |
| 469 | 470 |
| 470 TEST_P(TaskSchedulerWorkerPoolImplIORestrictionTest, IORestriction) { | 471 TEST_P(TaskSchedulerWorkerPoolImplIORestrictionTest, IORestriction) { |
| 471 TaskTracker task_tracker; | 472 TaskTracker task_tracker; |
| 472 DelayedTaskManager delayed_task_manager( | 473 DelayedTaskManager delayed_task_manager( |
| 473 make_scoped_refptr(new TestSimpleTaskRunner)); | 474 make_scoped_refptr(new TestSimpleTaskRunner)); |
| 474 | 475 |
| 475 auto worker_pool = SchedulerWorkerPoolImpl::Create( | 476 auto worker_pool = SchedulerWorkerPoolImpl::Create( |
| 476 SchedulerWorkerPoolParams("TestWorkerPoolWithParam", | 477 SchedulerWorkerPoolParams( |
| 477 ThreadPriority::NORMAL, GetParam(), 1U, | 478 "TestWorkerPoolWithParam", ThreadPriority::NORMAL, GetParam(), |
| 478 TimeDelta::Max()), | 479 StandbyThreadPolicy::LAZY, 1U, TimeDelta::Max()), |
| 479 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | 480 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 480 &delayed_task_manager); | 481 &delayed_task_manager); |
| 481 ASSERT_TRUE(worker_pool); | 482 ASSERT_TRUE(worker_pool); |
| 482 | 483 |
| 483 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, | 484 WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL, |
| 484 WaitableEvent::InitialState::NOT_SIGNALED); | 485 WaitableEvent::InitialState::NOT_SIGNALED); |
| 485 worker_pool->CreateTaskRunnerWithTraits(TaskTraits()) | 486 worker_pool->CreateTaskRunnerWithTraits(TaskTraits()) |
| 486 ->PostTask(FROM_HERE, Bind(&ExpectIORestriction, GetParam(), &task_ran)); | 487 ->PostTask(FROM_HERE, Bind(&ExpectIORestriction, GetParam(), &task_ran)); |
| 487 task_ran.Wait(); | 488 task_ran.Wait(); |
| 488 | 489 |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 818 PlatformThread::Sleep(kReclaimTimeForDetachTests + kExtraTimeToWaitForDetach); | 819 PlatformThread::Sleep(kReclaimTimeForDetachTests + kExtraTimeToWaitForDetach); |
| 819 worker_pool_->DisallowWorkerDetachmentForTesting(); | 820 worker_pool_->DisallowWorkerDetachmentForTesting(); |
| 820 | 821 |
| 821 // Verify that counts were recorded to the histogram as expected. | 822 // Verify that counts were recorded to the histogram as expected. |
| 822 const auto* histogram = worker_pool_->num_tasks_before_detach_histogram(); | 823 const auto* histogram = worker_pool_->num_tasks_before_detach_histogram(); |
| 823 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); | 824 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0)); |
| 824 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); | 825 EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3)); |
| 825 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); | 826 EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10)); |
| 826 } | 827 } |
| 827 | 828 |
| 829 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitLazy) { |
| 830 TaskTracker task_tracker; |
| 831 DelayedTaskManager delayed_task_manager( |
| 832 make_scoped_refptr(new TestSimpleTaskRunner)); |
| 833 auto worker_pool = SchedulerWorkerPoolImpl::Create( |
| 834 SchedulerWorkerPoolParams("LazyPolicyWorkerPool", ThreadPriority::NORMAL, |
| 835 IORestriction::DISALLOWED, |
| 836 StandbyThreadPolicy::LAZY, 8U, |
| 837 TimeDelta::Max()), |
| 838 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 839 &delayed_task_manager); |
| 840 ASSERT_TRUE(worker_pool); |
| 841 EXPECT_EQ(0U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 842 worker_pool->JoinForTesting(); |
| 843 } |
| 844 |
| 845 TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) { |
| 846 TaskTracker task_tracker; |
| 847 DelayedTaskManager delayed_task_manager( |
| 848 make_scoped_refptr(new TestSimpleTaskRunner)); |
| 849 auto worker_pool = SchedulerWorkerPoolImpl::Create( |
| 850 SchedulerWorkerPoolParams("LazyPolicyWorkerPool", ThreadPriority::NORMAL, |
| 851 IORestriction::DISALLOWED, |
| 852 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), |
| 853 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 854 &delayed_task_manager); |
| 855 ASSERT_TRUE(worker_pool); |
| 856 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 857 worker_pool->JoinForTesting(); |
| 858 } |
| 859 |
| 828 } // namespace internal | 860 } // namespace internal |
| 829 } // namespace base | 861 } // namespace base |
| OLD | NEW |