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

Side by Side Diff: base/task_scheduler/scheduler_worker_pool_impl_unittest.cc

Issue 2501763002: Add Thread Standby Policy SchedulerWorkerPoolImpl (Closed)
Patch Set: Rebase to edc7bea Created 4 years, 1 month 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 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
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
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
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
OLDNEW
« no previous file with comments | « base/task_scheduler/scheduler_worker_pool_impl.cc ('k') | base/task_scheduler/scheduler_worker_pool_params.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698