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

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

Issue 2590443005: Add TaskTraits::MayBlock and TaskTraits::WithSyncPrimitives. (Closed)
Patch Set: CR 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_scheduler_impl_unittest.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 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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | base/task_scheduler/task_scheduler_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698