| 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |