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 |