Index: base/task_scheduler/scheduler_worker_thread_unittest.cc |
diff --git a/base/task_scheduler/scheduler_worker_thread_unittest.cc b/base/task_scheduler/scheduler_worker_thread_unittest.cc |
index dd414d0a6426ad0f9e6f9a3484c8910cc6cdf5bd..9e9e28862572ead1422520821f43215291440082 100644 |
--- a/base/task_scheduler/scheduler_worker_thread_unittest.cc |
+++ b/base/task_scheduler/scheduler_worker_thread_unittest.cc |
@@ -27,16 +27,17 @@ namespace { |
const size_t kNumSequencesPerTest = 150; |
// The test parameter is the number of Tasks per Sequence returned by GetWork(). |
-class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t>, |
- public SchedulerWorkerThread::Delegate { |
+class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t> { |
protected: |
TaskSchedulerWorkerThreadTest() |
: main_entry_called_(true, false), |
num_get_work_cv_(lock_.CreateConditionVariable()) {} |
void SetUp() override { |
- worker_thread_ = SchedulerWorkerThread::CreateSchedulerWorkerThread( |
- ThreadPriority::NORMAL, this, &task_tracker_); |
+ worker_thread_ = SchedulerWorkerThread::Create( |
+ ThreadPriority::NORMAL, |
+ WrapUnique(new TestSchedulerWorkerThreadDelegate(this)), |
+ &task_tracker_); |
ASSERT_TRUE(worker_thread_); |
main_entry_called_.Wait(); |
} |
@@ -83,74 +84,85 @@ class TaskSchedulerWorkerThreadTest : public testing::TestWithParam<size_t>, |
std::unique_ptr<SchedulerWorkerThread> worker_thread_; |
private: |
- // SchedulerWorkerThread::Delegate: |
- void OnMainEntry() override { |
- // Without this |auto_lock|, OnMainEntry() could be called twice without |
- // generating an error. |
- AutoSchedulerLock auto_lock(lock_); |
- EXPECT_FALSE(main_entry_called_.IsSignaled()); |
- main_entry_called_.Signal(); |
- } |
- |
- scoped_refptr<Sequence> GetWork( |
- SchedulerWorkerThread* worker_thread) override { |
- EXPECT_EQ(worker_thread_.get(), worker_thread); |
- |
- { |
- AutoSchedulerLock auto_lock(lock_); |
- |
- // Increment the number of times that this method has been called. |
- ++num_get_work_; |
- num_get_work_cv_->Signal(); |
- |
- // Verify that this method isn't called more times than expected. |
- EXPECT_LE(num_get_work_, max_get_work_); |
- |
- // Check if a Sequence should be returned. |
- if (num_sequences_to_create_ == 0) |
- return nullptr; |
- --num_sequences_to_create_; |
+ class TestSchedulerWorkerThreadDelegate |
+ : public SchedulerWorkerThread::Delegate { |
+ public: |
+ TestSchedulerWorkerThreadDelegate(TaskSchedulerWorkerThreadTest* outer) |
+ : outer_(outer) {} |
+ |
+ // SchedulerWorkerThread::Delegate: |
+ void OnMainEntry() override { |
+ // Without synchronization, OnMainEntry() could be called twice without |
+ // generating an error. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ EXPECT_FALSE(outer_->main_entry_called_.IsSignaled()); |
+ outer_->main_entry_called_.Signal(); |
} |
- // Create a Sequence with TasksPerSequence() Tasks. |
- scoped_refptr<Sequence> sequence(new Sequence); |
- for (size_t i = 0; i < TasksPerSequence(); ++i) { |
- std::unique_ptr<Task> task(new Task( |
- FROM_HERE, Bind(&TaskSchedulerWorkerThreadTest::RunTaskCallback, |
- Unretained(this)), |
- TaskTraits(), TimeTicks())); |
- EXPECT_TRUE(task_tracker_.WillPostTask(task.get())); |
- sequence->PushTask(std::move(task)); |
+ scoped_refptr<Sequence> GetWork( |
+ SchedulerWorkerThread* worker_thread) override { |
+ EXPECT_EQ(outer_->worker_thread_.get(), worker_thread); |
+ |
+ { |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ |
+ // Increment the number of times that this method has been called. |
+ ++outer_->num_get_work_; |
+ outer_->num_get_work_cv_->Signal(); |
+ |
+ // Verify that this method isn't called more times than expected. |
+ EXPECT_LE(outer_->num_get_work_, outer_->max_get_work_); |
+ |
+ // Check if a Sequence should be returned. |
+ if (outer_->num_sequences_to_create_ == 0) |
+ return nullptr; |
+ --outer_->num_sequences_to_create_; |
+ } |
+ |
+ // Create a Sequence with TasksPerSequence() Tasks. |
+ scoped_refptr<Sequence> sequence(new Sequence); |
+ for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) { |
+ std::unique_ptr<Task> task(new Task( |
+ FROM_HERE, Bind(&TaskSchedulerWorkerThreadTest::RunTaskCallback, |
+ Unretained(outer_)), |
+ TaskTraits(), TimeTicks())); |
+ EXPECT_TRUE(outer_->task_tracker_.WillPostTask(task.get())); |
+ sequence->PushTask(std::move(task)); |
+ } |
+ |
+ { |
+ // Add the Sequence to the vector of created Sequences. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ outer_->created_sequences_.push_back(sequence); |
+ } |
+ |
+ return sequence; |
} |
- { |
- // Add the Sequence to the vector of created Sequences. |
- AutoSchedulerLock auto_lock(lock_); |
- created_sequences_.push_back(sequence); |
+ // This override verifies that |sequence| contains the expected number of |
+ // Tasks and adds it to |enqueued_sequences_|. Unlike a normal |
+ // EnqueueSequence implementation, it doesn't reinsert |sequence| into a |
+ // queue for further execution. |
+ void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override { |
+ EXPECT_GT(outer_->TasksPerSequence(), 1U); |
+ |
+ // Verify that |sequence| contains TasksPerSequence() - 1 Tasks. |
+ for (size_t i = 0; i < outer_->TasksPerSequence() - 1; ++i) { |
+ EXPECT_TRUE(sequence->PeekTask()); |
+ sequence->PopTask(); |
+ } |
+ EXPECT_FALSE(sequence->PeekTask()); |
+ |
+ // Add |sequence| to |re_enqueued_sequences_|. |
+ AutoSchedulerLock auto_lock(outer_->lock_); |
+ outer_->re_enqueued_sequences_.push_back(std::move(sequence)); |
+ EXPECT_LE(outer_->re_enqueued_sequences_.size(), |
+ outer_->created_sequences_.size()); |
} |
- return sequence; |
- } |
- |
- // This override verifies that |sequence| contains the expected number of |
- // Tasks and adds it to |re_enqueued_sequences_|. Unlike a normal |
- // ReEnqueueSequence implementation, it doesn't reinsert |sequence| into a |
- // queue for further execution. |
- void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override { |
- EXPECT_GT(TasksPerSequence(), 1U); |
- |
- // Verify that |sequence| contains TasksPerSequence() - 1 Tasks. |
- for (size_t i = 0; i < TasksPerSequence() - 1; ++i) { |
- EXPECT_TRUE(sequence->PeekTask()); |
- sequence->PopTask(); |
- } |
- EXPECT_FALSE(sequence->PeekTask()); |
- |
- // Add |sequence| to |re_enqueued_sequences_|. |
- AutoSchedulerLock auto_lock(lock_); |
- re_enqueued_sequences_.push_back(std::move(sequence)); |
- EXPECT_LE(re_enqueued_sequences_.size(), created_sequences_.size()); |
- } |
+ private: |
+ TaskSchedulerWorkerThreadTest* outer_; |
+ }; |
void RunTaskCallback() { |
AutoSchedulerLock auto_lock(lock_); |