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

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

Issue 2531663003: TaskScheduler: Add TaskTraits::WithWait(). (Closed)
Patch Set: CR robliao #9 (wording, order of ThreadRestrictions reset) Created 4 years 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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | base/task_scheduler/task_tracker.cc » ('j') | base/task_scheduler/task_tracker_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698