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

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

Issue 2531663003: TaskScheduler: Add TaskTraits::WithWait(). (Closed)
Patch Set: CR danakj #22 (AssertWaitAllowed) 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
« no previous file with comments | « no previous file | base/task_scheduler/task_tracker.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 const SequenceSortKey sort_key(sequence->GetSortKey()); 108 const SequenceSortKey sort_key(sequence->GetSortKey());
109 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key); 109 worker_pool_->ReEnqueueSequence(std::move(sequence), sort_key);
110 } 110 }
111 111
112 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest); 112 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest);
113 }; 113 };
114 114
115 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode( 115 scoped_refptr<TaskRunner> CreateTaskRunnerWithExecutionMode(
116 SchedulerWorkerPoolImpl* worker_pool, 116 SchedulerWorkerPoolImpl* worker_pool,
117 test::ExecutionMode execution_mode) { 117 test::ExecutionMode execution_mode) {
118 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent.
119 const TaskTraits traits = TaskTraits().WithWait();
118 switch (execution_mode) { 120 switch (execution_mode) {
119 case test::ExecutionMode::PARALLEL: 121 case test::ExecutionMode::PARALLEL:
120 return worker_pool->CreateTaskRunnerWithTraits(TaskTraits()); 122 return worker_pool->CreateTaskRunnerWithTraits(traits);
121 case test::ExecutionMode::SEQUENCED: 123 case test::ExecutionMode::SEQUENCED:
122 return worker_pool->CreateSequencedTaskRunnerWithTraits(TaskTraits()); 124 return worker_pool->CreateSequencedTaskRunnerWithTraits(traits);
123 case test::ExecutionMode::SINGLE_THREADED: 125 case test::ExecutionMode::SINGLE_THREADED:
124 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(TaskTraits()); 126 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(traits);
125 } 127 }
126 ADD_FAILURE() << "Unknown ExecutionMode"; 128 ADD_FAILURE() << "Unknown ExecutionMode";
127 return nullptr; 129 return nullptr;
128 } 130 }
129 131
130 using PostNestedTask = test::TestTaskFactory::PostNestedTask; 132 using PostNestedTask = test::TestTaskFactory::PostNestedTask;
131 133
132 class ThreadPostingTasks : public SimpleThread { 134 class ThreadPostingTasks : public SimpleThread {
133 public: 135 public:
134 enum class WaitBeforePostTask { 136 enum class WaitBeforePostTask {
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 }; 598 };
597 599
598 } // namespace 600 } // namespace
599 601
600 // Checks that at least one thread has detached by checking the TLS. 602 // Checks that at least one thread has detached by checking the TLS.
601 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) { 603 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) {
602 // Saturate the threads and mark each thread with a magic TLS value. 604 // Saturate the threads and mark each thread with a magic TLS value.
603 std::vector<std::unique_ptr<test::TestTaskFactory>> factories; 605 std::vector<std::unique_ptr<test::TestTaskFactory>> factories;
604 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { 606 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
605 factories.push_back(MakeUnique<test::TestTaskFactory>( 607 factories.push_back(MakeUnique<test::TestTaskFactory>(
606 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits()), 608 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait()),
607 test::ExecutionMode::PARALLEL)); 609 test::ExecutionMode::PARALLEL));
608 ASSERT_TRUE(factories.back()->PostTask( 610 ASSERT_TRUE(factories.back()->PostTask(
609 PostNestedTask::NO, 611 PostNestedTask::NO,
610 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait, 612 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait,
611 Unretained(this)))); 613 Unretained(this))));
612 factories.back()->WaitForAllTasksToRun(); 614 factories.back()->WaitForAllTasksToRun();
613 } 615 }
614 616
615 // Release tasks waiting on |waiter_|. 617 // Release tasks waiting on |waiter_|.
616 waiter_.Signal(); 618 waiter_.Signal();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 669
668 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest); 670 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest);
669 }; 671 };
670 672
671 } // namespace 673 } // namespace
672 674
673 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) { 675 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) {
674 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, 676 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
675 WaitableEvent::InitialState::NOT_SIGNALED); 677 WaitableEvent::InitialState::NOT_SIGNALED);
676 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); 678 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool);
677 auto task_runner = 679 auto task_runner = worker_pool_->CreateSequencedTaskRunnerWithTraits(
678 worker_pool_->CreateSequencedTaskRunnerWithTraits(TaskTraits()); 680 TaskTraits().WithWait());
679 681
680 // Post a task. 682 // Post a task.
681 task_runner->PostTask(FROM_HERE, 683 task_runner->PostTask(FROM_HERE,
682 Bind(&WaitableEvent::Wait, Unretained(&event))); 684 Bind(&WaitableEvent::Wait, Unretained(&event)));
683 685
684 // Post 2 more tasks while the first task hasn't completed its execution. It 686 // Post 2 more tasks while the first task hasn't completed its execution. It
685 // is guaranteed that these tasks will run immediately after the first task, 687 // is guaranteed that these tasks will run immediately after the first task,
686 // without allowing the worker to sleep. 688 // without allowing the worker to sleep.
687 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); 689 task_runner->PostTask(FROM_HERE, Bind(&DoNothing));
688 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); 690 task_runner->PostTask(FROM_HERE, Bind(&DoNothing));
(...skipping 22 matching lines...) Expand all
711 signal_event->Signal(); 713 signal_event->Signal();
712 wait_event->Wait(); 714 wait_event->Wait();
713 } 715 }
714 716
715 } // namespace 717 } // namespace
716 718
717 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) { 719 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) {
718 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL, 720 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL,
719 WaitableEvent::InitialState::NOT_SIGNALED); 721 WaitableEvent::InitialState::NOT_SIGNALED);
720 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool); 722 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool);
721 auto task_runner = worker_pool_->CreateTaskRunnerWithTraits(TaskTraits()); 723 auto task_runner =
724 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait());
722 725
723 // Post tasks to saturate the pool. 726 // Post tasks to saturate the pool.
724 std::vector<std::unique_ptr<WaitableEvent>> task_started_events; 727 std::vector<std::unique_ptr<WaitableEvent>> task_started_events;
725 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { 728 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
726 task_started_events.push_back( 729 task_started_events.push_back(
727 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL, 730 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL,
728 WaitableEvent::InitialState::NOT_SIGNALED)); 731 WaitableEvent::InitialState::NOT_SIGNALED));
729 task_runner->PostTask( 732 task_runner->PostTask(
730 FROM_HERE, 733 FROM_HERE,
731 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()), 734 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()),
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), 855 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()),
853 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, 856 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker,
854 &delayed_task_manager); 857 &delayed_task_manager);
855 ASSERT_TRUE(worker_pool); 858 ASSERT_TRUE(worker_pool);
856 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); 859 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting());
857 worker_pool->JoinForTesting(); 860 worker_pool->JoinForTesting();
858 } 861 }
859 862
860 } // namespace internal 863 } // namespace internal
861 } // namespace base 864 } // namespace base
OLDNEW
« no previous file with comments | « no previous file | base/task_scheduler/task_tracker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698