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

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

Issue 2399213005: TaskScheduler: Change Sequence::PeekTask to Sequence::TakeTask. (Closed)
Patch Set: self-review Created 4 years, 2 months 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
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.h" 5 #include "base/task_scheduler/scheduler_worker.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
(...skipping 28 matching lines...) Expand all
39 class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate { 39 class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate {
40 public: 40 public:
41 SchedulerWorkerDefaultDelegate() = default; 41 SchedulerWorkerDefaultDelegate() = default;
42 42
43 // SchedulerWorker::Delegate: 43 // SchedulerWorker::Delegate:
44 void OnMainEntry(SchedulerWorker* worker, 44 void OnMainEntry(SchedulerWorker* worker,
45 const TimeDelta& detach_duration) override {} 45 const TimeDelta& detach_duration) override {}
46 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override { 46 scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
47 return nullptr; 47 return nullptr;
48 } 48 }
49 void DidRunTask(const Task* task, const TimeDelta& task_latency) override { 49 void DidRunTask(TaskPriority task_priority,
50 const TimeDelta& task_latency) override {
50 ADD_FAILURE() << "Unexpected call to DidRunTask()"; 51 ADD_FAILURE() << "Unexpected call to DidRunTask()";
51 } 52 }
52 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override { 53 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
53 ADD_FAILURE() << "Unexpected call to ReEnqueueSequence()"; 54 ADD_FAILURE() << "Unexpected call to ReEnqueueSequence()";
54 } 55 }
55 TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); } 56 TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); }
56 bool CanDetach(SchedulerWorker* worker) override { return false; } 57 bool CanDetach(SchedulerWorker* worker) override { return false; }
57 58
58 private: 59 private:
59 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDefaultDelegate); 60 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDefaultDelegate);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 scoped_refptr<Sequence> sequence(new Sequence); 168 scoped_refptr<Sequence> sequence(new Sequence);
168 for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) { 169 for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) {
169 std::unique_ptr<Task> task(new Task( 170 std::unique_ptr<Task> task(new Task(
170 FROM_HERE, Bind(&TaskSchedulerWorkerTest::RunTaskCallback, 171 FROM_HERE, Bind(&TaskSchedulerWorkerTest::RunTaskCallback,
171 Unretained(outer_)), 172 Unretained(outer_)),
172 TaskTraits(), TimeDelta())); 173 TaskTraits(), TimeDelta()));
173 EXPECT_TRUE(outer_->task_tracker_.WillPostTask(task.get())); 174 EXPECT_TRUE(outer_->task_tracker_.WillPostTask(task.get()));
174 sequence->PushTask(std::move(task)); 175 sequence->PushTask(std::move(task));
175 } 176 }
176 177
177 ExpectCallToDidRunTask(sequence->PeekTask()); 178 ExpectCallToDidRunTask(sequence->PeekTaskTraits().priority());
178 179
179 { 180 {
180 // Add the Sequence to the vector of created Sequences. 181 // Add the Sequence to the vector of created Sequences.
181 AutoSchedulerLock auto_lock(outer_->lock_); 182 AutoSchedulerLock auto_lock(outer_->lock_);
182 outer_->created_sequences_.push_back(sequence); 183 outer_->created_sequences_.push_back(sequence);
183 } 184 }
184 185
185 return sequence; 186 return sequence;
186 } 187 }
187 188
188 void DidRunTask(const Task* task, const TimeDelta& task_latency) override { 189 void DidRunTask(TaskPriority task_priority,
190 const TimeDelta& task_latency) override {
189 AutoSchedulerLock auto_lock(expect_did_run_task_lock_); 191 AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
190 EXPECT_EQ(expect_did_run_task_, task); 192 EXPECT_TRUE(expect_did_run_task_);
191 expect_did_run_task_ = nullptr; 193 EXPECT_EQ(expect_did_run_task_with_priority_, task_priority);
192 EXPECT_FALSE(task_latency.is_max()); 194 EXPECT_FALSE(task_latency.is_max());
195 expect_did_run_task_ = false;
193 } 196 }
194 197
195 // This override verifies that |sequence| contains the expected number of 198 // This override verifies that |sequence| contains the expected number of
196 // Tasks and adds it to |enqueued_sequences_|. Unlike a normal 199 // Tasks and adds it to |enqueued_sequences_|. Unlike a normal
197 // EnqueueSequence implementation, it doesn't reinsert |sequence| into a 200 // EnqueueSequence implementation, it doesn't reinsert |sequence| into a
198 // queue for further execution. 201 // queue for further execution.
199 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override { 202 void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
200 EXPECT_FALSE(IsCallToDidRunTaskExpected()); 203 EXPECT_FALSE(IsCallToDidRunTaskExpected());
201 EXPECT_GT(outer_->TasksPerSequence(), 1U); 204 EXPECT_GT(outer_->TasksPerSequence(), 1U);
202 205
203 // Verify that |sequence| contains TasksPerSequence() - 1 Tasks. 206 // Verify that |sequence| contains TasksPerSequence() - 1 Tasks.
204 for (size_t i = 0; i < outer_->TasksPerSequence() - 1; ++i) { 207 for (size_t i = 0; i < outer_->TasksPerSequence() - 1; ++i) {
205 EXPECT_TRUE(sequence->PeekTask()); 208 EXPECT_TRUE(sequence->TakeTask());
206 sequence->PopTask(); 209 EXPECT_EQ(i == outer_->TasksPerSequence() - 2, sequence->Pop());
207 } 210 }
208 EXPECT_FALSE(sequence->PeekTask());
209 211
210 // Add |sequence| to |re_enqueued_sequences_|. 212 // Add |sequence| to |re_enqueued_sequences_|.
211 AutoSchedulerLock auto_lock(outer_->lock_); 213 AutoSchedulerLock auto_lock(outer_->lock_);
212 outer_->re_enqueued_sequences_.push_back(std::move(sequence)); 214 outer_->re_enqueued_sequences_.push_back(std::move(sequence));
213 EXPECT_LE(outer_->re_enqueued_sequences_.size(), 215 EXPECT_LE(outer_->re_enqueued_sequences_.size(),
214 outer_->created_sequences_.size()); 216 outer_->created_sequences_.size());
215 } 217 }
216 218
217 private: 219 private:
218 // Expect a call to DidRunTask() with |task| as argument before the next 220 // Expect a call to DidRunTask() with |task_priority| as argument before the
219 // call to any other method of this delegate. 221 // next call to any other method of this delegate.
220 void ExpectCallToDidRunTask(const Task* task) { 222 void ExpectCallToDidRunTask(TaskPriority task_priority) {
221 AutoSchedulerLock auto_lock(expect_did_run_task_lock_); 223 AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
222 expect_did_run_task_ = task; 224 expect_did_run_task_ = true;
225 expect_did_run_task_with_priority_ = task_priority;
223 } 226 }
224 227
225 bool IsCallToDidRunTaskExpected() const { 228 bool IsCallToDidRunTaskExpected() const {
226 AutoSchedulerLock auto_lock(expect_did_run_task_lock_); 229 AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
227 return expect_did_run_task_ != nullptr; 230 return expect_did_run_task_;
228 } 231 }
229 232
230 TaskSchedulerWorkerTest* outer_; 233 TaskSchedulerWorkerTest* outer_;
231 234
232 // Synchronizes access to |expect_did_run_task_|. 235 // Synchronizes access to |expect_did_run_task_| and
236 // |expect_did_run_task_with_priority_|.
233 mutable SchedulerLock expect_did_run_task_lock_; 237 mutable SchedulerLock expect_did_run_task_lock_;
234 238
235 // Expected task for the next call to DidRunTask(). DidRunTask() should not 239 // When this is true, the next method called on this delegate should be
robliao 2016/10/07 20:57:11 Instead: Whether the next method called on this de
fdoray 2016/10/11 12:29:19 Done.
236 // be called when this is nullptr. No method other than DidRunTask() should 240 // DidRunTask().
237 // be called on this delegate when this is not nullptr. 241 bool expect_did_run_task_ = false;
238 const Task* expect_did_run_task_ = nullptr; 242
243 // Expected priority for the next call to DidRunTask().
244 TaskPriority expect_did_run_task_with_priority_ = TaskPriority::BACKGROUND;
239 }; 245 };
240 246
241 void RunTaskCallback() { 247 void RunTaskCallback() {
242 AutoSchedulerLock auto_lock(lock_); 248 AutoSchedulerLock auto_lock(lock_);
243 ++num_run_tasks_; 249 ++num_run_tasks_;
244 EXPECT_LE(num_run_tasks_, created_sequences_.size()); 250 EXPECT_LE(num_run_tasks_, created_sequences_.size());
245 } 251 }
246 252
247 TaskTracker task_tracker_; 253 TaskTracker task_tracker_;
248 254
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 work_requested_ = true; 383 work_requested_ = true;
378 scoped_refptr<Sequence> sequence(new Sequence); 384 scoped_refptr<Sequence> sequence(new Sequence);
379 std::unique_ptr<Task> task(new Task( 385 std::unique_ptr<Task> task(new Task(
380 FROM_HERE, Bind(&WaitableEvent::Signal, Unretained(&work_processed_)), 386 FROM_HERE, Bind(&WaitableEvent::Signal, Unretained(&work_processed_)),
381 TaskTraits(), TimeDelta())); 387 TaskTraits(), TimeDelta()));
382 EXPECT_TRUE(task_tracker_->WillPostTask(task.get())); 388 EXPECT_TRUE(task_tracker_->WillPostTask(task.get()));
383 sequence->PushTask(std::move(task)); 389 sequence->PushTask(std::move(task));
384 return sequence; 390 return sequence;
385 } 391 }
386 392
387 void DidRunTask(const Task* task, const TimeDelta& task_latency) override {} 393 void DidRunTask(TaskPriority task, const TimeDelta& task_latency) override {}
388 394
389 bool CanDetach(SchedulerWorker* worker) override { 395 bool CanDetach(SchedulerWorker* worker) override {
390 detach_requested_.Signal(); 396 detach_requested_.Signal();
391 return can_detach_; 397 return can_detach_;
392 } 398 }
393 399
394 void WaitForWorkToRun() { 400 void WaitForWorkToRun() {
395 work_processed_.Wait(); 401 work_processed_.Wait();
396 } 402 }
397 403
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 // OnMainEntry() and GetWork() are called. 596 // OnMainEntry() and GetWork() are called.
591 worker->WakeUp(); 597 worker->WakeUp();
592 delegate_raw->WaitForPriorityVerifiedInGetWork(); 598 delegate_raw->WaitForPriorityVerifiedInGetWork();
593 599
594 worker->JoinForTesting(); 600 worker->JoinForTesting();
595 } 601 }
596 602
597 } // namespace 603 } // namespace
598 } // namespace internal 604 } // namespace internal
599 } // namespace base 605 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698