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.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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |