| 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 // TODO - test this case. |
| 252 // If a task was deferred, try again with another task. | 258 // If a task was deferred, try again with another task. |
| 259 for (auto& observer : task_time_observers_) { |
| 260 observer.ReportTaskEndTime(task_queue, |
| 261 MonotonicTimeInSeconds(task_start_time), |
| 262 MonotonicTimeInSeconds(task_start_time)); |
| 263 } |
| 253 continue; | 264 continue; |
| 254 case ProcessTaskResult::EXECUTED: | 265 case ProcessTaskResult::EXECUTED: |
| 255 break; | 266 break; |
| 256 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: | 267 case ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED: |
| 257 return; // The TaskQueueManager got deleted, we must bail out. | 268 return; // The TaskQueueManager got deleted, we must bail out. |
| 258 } | 269 } |
| 259 | 270 |
| 260 lazy_now = real_time_domain()->CreateLazyNow(); | 271 lazy_now = real_time_domain()->CreateLazyNow(); |
| 261 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { | 272 if (!delegate_->IsNested() && task_start_time != base::TimeTicks()) { |
| 262 // Only report top level task durations. | 273 // Only report top level task durations. |
| 263 base::TimeTicks task_end_time = lazy_now.Now(); | 274 base::TimeTicks task_end_time = lazy_now.Now(); |
| 264 for (auto& observer : task_time_observers_) { | 275 for (auto& observer : task_time_observers_) { |
| 265 observer.ReportTaskTime(task_queue, | 276 observer.ReportTaskEndTime(task_queue, |
| 266 MonotonicTimeInSeconds(task_start_time), | 277 MonotonicTimeInSeconds(task_start_time), |
| 267 MonotonicTimeInSeconds(task_end_time)); | 278 MonotonicTimeInSeconds(task_end_time)); |
| 268 } | 279 } |
| 269 task_start_time = task_end_time; | 280 task_start_time = task_end_time; |
| 270 } | 281 } |
| 271 | 282 |
| 272 work_queue = nullptr; // The queue may have been unregistered. | 283 work_queue = nullptr; // The queue may have been unregistered. |
| 273 | 284 |
| 274 UpdateWorkQueues(lazy_now); | 285 UpdateWorkQueues(lazy_now); |
| 275 | 286 |
| 276 // Only run a single task per batch in nested run loops so that we can | 287 // 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(). | 288 // 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()); | 501 *work_queue->GetFrontTask()); |
| 491 } | 502 } |
| 492 } | 503 } |
| 493 | 504 |
| 494 bool TaskQueueManager::HasImmediateWorkForTesting() const { | 505 bool TaskQueueManager::HasImmediateWorkForTesting() const { |
| 495 return !selector_.EnabledWorkQueuesEmpty(); | 506 return !selector_.EnabledWorkQueuesEmpty(); |
| 496 } | 507 } |
| 497 | 508 |
| 498 } // namespace scheduler | 509 } // namespace scheduler |
| 499 } // namespace blink | 510 } // namespace blink |
| OLD | NEW |