| 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 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. | 117 // Allow tasks posted to the returned TaskRunner to wait on a WaitableEvent. |
| 118 const TaskTraits traits = TaskTraits().WithWait(); | 118 const TaskTraits traits = TaskTraits().WithSyncPrimitives(); |
| 119 switch (execution_mode) { | 119 switch (execution_mode) { |
| 120 case test::ExecutionMode::PARALLEL: | 120 case test::ExecutionMode::PARALLEL: |
| 121 return worker_pool->CreateTaskRunnerWithTraits(traits); | 121 return worker_pool->CreateTaskRunnerWithTraits(traits); |
| 122 case test::ExecutionMode::SEQUENCED: | 122 case test::ExecutionMode::SEQUENCED: |
| 123 return worker_pool->CreateSequencedTaskRunnerWithTraits(traits); | 123 return worker_pool->CreateSequencedTaskRunnerWithTraits(traits); |
| 124 case test::ExecutionMode::SINGLE_THREADED: | 124 case test::ExecutionMode::SINGLE_THREADED: |
| 125 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(traits); | 125 return worker_pool->CreateSingleThreadTaskRunnerWithTraits(traits); |
| 126 } | 126 } |
| 127 ADD_FAILURE() << "Unknown ExecutionMode"; | 127 ADD_FAILURE() << "Unknown ExecutionMode"; |
| 128 return nullptr; | 128 return nullptr; |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 }; | 536 }; |
| 537 | 537 |
| 538 } // namespace | 538 } // namespace |
| 539 | 539 |
| 540 // 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. |
| 541 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) { | 541 TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckDetachedThreads) { |
| 542 // 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. |
| 543 std::vector<std::unique_ptr<test::TestTaskFactory>> factories; | 543 std::vector<std::unique_ptr<test::TestTaskFactory>> factories; |
| 544 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { | 544 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { |
| 545 factories.push_back(MakeUnique<test::TestTaskFactory>( | 545 factories.push_back(MakeUnique<test::TestTaskFactory>( |
| 546 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait()), | 546 worker_pool_->CreateTaskRunnerWithTraits( |
| 547 TaskTraits().WithSyncPrimitives()), |
| 547 test::ExecutionMode::PARALLEL)); | 548 test::ExecutionMode::PARALLEL)); |
| 548 ASSERT_TRUE(factories.back()->PostTask( | 549 ASSERT_TRUE(factories.back()->PostTask( |
| 549 PostNestedTask::NO, | 550 PostNestedTask::NO, |
| 550 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait, | 551 Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait, |
| 551 Unretained(this)))); | 552 Unretained(this)))); |
| 552 factories.back()->WaitForAllTasksToRun(); | 553 factories.back()->WaitForAllTasksToRun(); |
| 553 } | 554 } |
| 554 | 555 |
| 555 // Release tasks waiting on |waiter_|. | 556 // Release tasks waiting on |waiter_|. |
| 556 waiter_.Signal(); | 557 waiter_.Signal(); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest); | 609 DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest); |
| 609 }; | 610 }; |
| 610 | 611 |
| 611 } // namespace | 612 } // namespace |
| 612 | 613 |
| 613 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) { | 614 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) { |
| 614 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, | 615 WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL, |
| 615 WaitableEvent::InitialState::NOT_SIGNALED); | 616 WaitableEvent::InitialState::NOT_SIGNALED); |
| 616 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); | 617 InitializeWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool); |
| 617 auto task_runner = worker_pool_->CreateSequencedTaskRunnerWithTraits( | 618 auto task_runner = worker_pool_->CreateSequencedTaskRunnerWithTraits( |
| 618 TaskTraits().WithWait()); | 619 TaskTraits().WithSyncPrimitives()); |
| 619 | 620 |
| 620 // Post a task. | 621 // Post a task. |
| 621 task_runner->PostTask(FROM_HERE, | 622 task_runner->PostTask(FROM_HERE, |
| 622 Bind(&WaitableEvent::Wait, Unretained(&event))); | 623 Bind(&WaitableEvent::Wait, Unretained(&event))); |
| 623 | 624 |
| 624 // Post 2 more tasks while the first task hasn't completed its execution. It | 625 // Post 2 more tasks while the first task hasn't completed its execution. It |
| 625 // is guaranteed that these tasks will run immediately after the first task, | 626 // is guaranteed that these tasks will run immediately after the first task, |
| 626 // without allowing the worker to sleep. | 627 // without allowing the worker to sleep. |
| 627 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); | 628 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); |
| 628 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); | 629 task_runner->PostTask(FROM_HERE, Bind(&DoNothing)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 651 signal_event->Signal(); | 652 signal_event->Signal(); |
| 652 wait_event->Wait(); | 653 wait_event->Wait(); |
| 653 } | 654 } |
| 654 | 655 |
| 655 } // namespace | 656 } // namespace |
| 656 | 657 |
| 657 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) { | 658 TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaitsWithDetach) { |
| 658 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL, | 659 WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL, |
| 659 WaitableEvent::InitialState::NOT_SIGNALED); | 660 WaitableEvent::InitialState::NOT_SIGNALED); |
| 660 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool); | 661 InitializeWorkerPool(kReclaimTimeForDetachTests, kNumWorkersInWorkerPool); |
| 661 auto task_runner = | 662 auto task_runner = worker_pool_->CreateTaskRunnerWithTraits( |
| 662 worker_pool_->CreateTaskRunnerWithTraits(TaskTraits().WithWait()); | 663 TaskTraits().WithSyncPrimitives()); |
| 663 | 664 |
| 664 // Post tasks to saturate the pool. | 665 // Post tasks to saturate the pool. |
| 665 std::vector<std::unique_ptr<WaitableEvent>> task_started_events; | 666 std::vector<std::unique_ptr<WaitableEvent>> task_started_events; |
| 666 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { | 667 for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) { |
| 667 task_started_events.push_back( | 668 task_started_events.push_back( |
| 668 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL, | 669 MakeUnique<WaitableEvent>(WaitableEvent::ResetPolicy::MANUAL, |
| 669 WaitableEvent::InitialState::NOT_SIGNALED)); | 670 WaitableEvent::InitialState::NOT_SIGNALED)); |
| 670 task_runner->PostTask( | 671 task_runner->PostTask( |
| 671 FROM_HERE, | 672 FROM_HERE, |
| 672 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()), | 673 Bind(&SignalAndWaitEvent, Unretained(task_started_events.back().get()), |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 796 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), | 797 StandbyThreadPolicy::ONE, 8U, TimeDelta::Max()), |
| 797 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, | 798 Bind(&NotReachedReEnqueueSequenceCallback), &task_tracker, |
| 798 &delayed_task_manager); | 799 &delayed_task_manager); |
| 799 ASSERT_TRUE(worker_pool); | 800 ASSERT_TRUE(worker_pool); |
| 800 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); | 801 EXPECT_EQ(1U, worker_pool->NumberOfAliveWorkersForTesting()); |
| 801 worker_pool->JoinForTesting(); | 802 worker_pool->JoinForTesting(); |
| 802 } | 803 } |
| 803 | 804 |
| 804 } // namespace internal | 805 } // namespace internal |
| 805 } // namespace base | 806 } // namespace base |
| OLD | NEW |