OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "platform/scheduler/base/task_queue_manager.h" | 5 #include "platform/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
240 | 240 |
241 for (int i = 0; i < work_batch_size_; i++) { | 241 for (int i = 0; i < work_batch_size_; i++) { |
242 internal::WorkQueue* work_queue; | 242 internal::WorkQueue* work_queue; |
243 if (!SelectWorkQueueToService(&work_queue)) | 243 if (!SelectWorkQueueToService(&work_queue)) |
244 break; | 244 break; |
245 | 245 |
246 // TaskQueueManager guarantees that task queue will not be deleted | 246 // TaskQueueManager guarantees that task queue will not be deleted |
247 // when we are in DoWork (but WorkQueue may be deleted). | 247 // when we are in DoWork (but WorkQueue may be deleted). |
248 internal::TaskQueueImpl* task_queue = work_queue->task_queue(); | 248 internal::TaskQueueImpl* task_queue = work_queue->task_queue(); |
249 | 249 |
| 250 if (!delegate_->IsNested()) { |
| 251 for (auto& observer : task_time_observers_) |
| 252 observer.ReportTaskStartTime(MonotonicTimeInSeconds(task_start_time)); |
| 253 } |
| 254 |
250 switch (ProcessTaskFromWorkQueue(work_queue)) { | 255 switch (ProcessTaskFromWorkQueue(work_queue)) { |
251 case ProcessTaskResult::DEFERRED: | 256 case ProcessTaskResult::DEFERRED: |
| 257 if (delegate_->IsNested()) |
| 258 continue; |
| 259 // TODO - test this case. |
252 // If a task was deferred, try again with another task. | 260 // If a task was deferred, try again with another task. |
| 261 for (auto& observer : task_time_observers_) { |
| 262 observer.ReportTaskEndTime(task_queue, |
| 263 MonotonicTimeInSeconds(task_start_time), |
| 264 MonotonicTimeInSeconds(task_start_time)); |
| 265 } |
253 continue; | 266 continue; |
254 case ProcessTaskResult::EXECUTED: | 267 case ProcessTaskResult::EXECUTED: |
255 break; | 268 break; |
256 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: | 269 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: |
257 return; // The TaskQueueManager got deleted, we must bail out. | 270 return; // The TaskQueueManager got deleted, we must bail out. |
258 } | 271 } |
259 | 272 |
260 lazy_now = real_time_domain()->CreateLazyNow(); | 273 lazy_now = real_time_domain()->CreateLazyNow(); |
261 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { | 274 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { |
262 // Only report top level task durations. | 275 // Only report top level task durations. |
263 base::TimeTicks task_end_time = lazy_now.Now(); | 276 base::TimeTicks task_end_time = lazy_now.Now(); |
264 for (auto& observer : task_time_observers_) { | 277 for (auto& observer : task_time_observers_) { |
265 observer.ReportTaskTime(task_queue, | 278 observer.ReportTaskEndTime(task_queue, |
266 MonotonicTimeInSeconds(task_start_time), | 279 MonotonicTimeInSeconds(task_start_time), |
267 MonotonicTimeInSeconds(task_end_time)); | 280 MonotonicTimeInSeconds(task_end_time)); |
268 } | 281 } |
269 task_start_time = task_end_time; | 282 task_start_time = task_end_time; |
270 } | 283 } |
271 | 284 |
272 work_queue = nullptr; // The queue may have been unregistered. | 285 work_queue = nullptr; // The queue may have been unregistered. |
273 | 286 |
274 UpdateWorkQueues(lazy_now); | 287 UpdateWorkQueues(lazy_now); |
275 | 288 |
276 // Only run a single task per batch in nested run loops so that we can | 289 // Only run a single task per batch in nested run loops so that we can |
277 // properly exit the nested loop when someone calls RunLoop::Quit(). | 290 // properly exit the nested loop when someone calls RunLoop::Quit(). |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 *work_queue->GetFrontTask()); | 503 *work_queue->GetFrontTask()); |
491 } | 504 } |
492 } | 505 } |
493 | 506 |
494 bool TaskQueueManager::HasImmediateWorkForTesting() const { | 507 bool TaskQueueManager::HasImmediateWorkForTesting() const { |
495 return !selector_.EnabledWorkQueuesEmpty(); | 508 return !selector_.EnabledWorkQueuesEmpty(); |
496 } | 509 } |
497 | 510 |
498 } // namespace scheduler | 511 } // namespace scheduler |
499 } // namespace blink | 512 } // namespace blink |
OLD | NEW |