| 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" |
| 11 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 13 #include "platform/scheduler/base/real_time_domain.h" | 13 #include "platform/scheduler/base/real_time_domain.h" |
| 14 #include "platform/scheduler/base/task_queue_impl.h" | 14 #include "platform/scheduler/base/task_queue_impl.h" |
| 15 #include "platform/scheduler/base/task_queue_manager_delegate.h" | 15 #include "platform/scheduler/base/task_queue_manager_delegate.h" |
| 16 #include "platform/scheduler/base/task_queue_selector.h" | 16 #include "platform/scheduler/base/task_queue_selector.h" |
| 17 #include "platform/scheduler/base/task_time_observer.h" | 17 #include "platform/scheduler/base/task_time_observer.h" |
| 18 #include "platform/scheduler/base/work_queue.h" | 18 #include "platform/scheduler/base/work_queue.h" |
| 19 #include "platform/scheduler/base/work_queue_sets.h" | 19 #include "platform/scheduler/base/work_queue_sets.h" |
| 20 #include "platform/wtf/PtrUtil.h" | 20 #include "platform/wtf/PtrUtil.h" |
| 21 | 21 |
| 22 static const double kLongTaskTraceEventThreshold = 0.05; |
| 23 |
| 22 namespace blink { | 24 namespace blink { |
| 23 namespace scheduler { | 25 namespace scheduler { |
| 24 | 26 |
| 25 namespace { | 27 namespace { |
| 26 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; | 28 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; |
| 27 | 29 |
| 28 void RecordDelayedTaskLateness(base::TimeDelta lateness) { | 30 void RecordDelayedTaskLateness(base::TimeDelta lateness) { |
| 29 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", | 31 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", |
| 30 lateness); | 32 lateness); |
| 31 } | 33 } |
| (...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 currently_executing_task_queue_; | 530 currently_executing_task_queue_; |
| 529 currently_executing_task_queue_ = queue; | 531 currently_executing_task_queue_ = queue; |
| 530 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); | 532 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); |
| 531 // Detect if the TaskQueueManager just got deleted. If this happens we must | 533 // Detect if the TaskQueueManager just got deleted. If this happens we must |
| 532 // not access any member variables after this point. | 534 // not access any member variables after this point. |
| 533 if (protect->HasOneRef()) | 535 if (protect->HasOneRef()) |
| 534 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; | 536 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; |
| 535 | 537 |
| 536 currently_executing_task_queue_ = prev_executing_task_queue; | 538 currently_executing_task_queue_ = prev_executing_task_queue; |
| 537 | 539 |
| 538 | 540 double task_end_time = 0; |
| 539 if (queue->GetShouldNotifyObservers()) { | 541 if (queue->GetShouldNotifyObservers()) { |
| 540 if (task_start_time) { | 542 if (task_start_time) { |
| 541 *time_after_task = real_time_domain()->Now(); | 543 *time_after_task = real_time_domain()->Now(); |
| 542 double task_end_time = MonotonicTimeInSeconds(*time_after_task); | 544 task_end_time = MonotonicTimeInSeconds(*time_after_task); |
| 543 | 545 |
| 544 queue->OnTaskCompleted( | 546 queue->OnTaskCompleted( |
| 545 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time), | 547 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time), |
| 546 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time)); | 548 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time)); |
| 547 | 549 |
| 548 for (auto& observer : task_time_observers_) | 550 for (auto& observer : task_time_observers_) |
| 549 observer.DidProcessTask(task_start_time, task_end_time); | 551 observer.DidProcessTask(task_start_time, task_end_time); |
| 550 } | 552 } |
| 551 | 553 |
| 552 for (auto& observer : task_observers_) | 554 for (auto& observer : task_observers_) |
| 553 observer.DidProcessTask(pending_task); | 555 observer.DidProcessTask(pending_task); |
| 554 queue->NotifyDidProcessTask(pending_task); | 556 queue->NotifyDidProcessTask(pending_task); |
| 555 } | 557 } |
| 556 | 558 |
| 559 if (task_start_time && task_end_time && |
| 560 task_end_time - task_start_time > kLongTaskTraceEventThreshold) { |
| 561 TRACE_EVENT_INSTANT1("blink", "LongTask", TRACE_EVENT_SCOPE_THREAD, |
| 562 "duration", task_end_time - task_start_time); |
| 563 } |
| 564 |
| 557 return ProcessTaskResult::EXECUTED; | 565 return ProcessTaskResult::EXECUTED; |
| 558 } | 566 } |
| 559 | 567 |
| 560 void TaskQueueManager::MaybeRecordTaskDelayHistograms( | 568 void TaskQueueManager::MaybeRecordTaskDelayHistograms( |
| 561 const internal::TaskQueueImpl::Task& pending_task, | 569 const internal::TaskQueueImpl::Task& pending_task, |
| 562 const internal::TaskQueueImpl* queue) { | 570 const internal::TaskQueueImpl* queue) { |
| 563 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) | 571 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) |
| 564 return; | 572 return; |
| 565 | 573 |
| 566 // Record delayed task lateness and immediate task queuing durations. | 574 // Record delayed task lateness and immediate task queuing durations. |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 707 TimeDomain* time_domain = queue->GetTimeDomain(); | 715 TimeDomain* time_domain = queue->GetTimeDomain(); |
| 708 if (time_domain_now.find(time_domain) == time_domain_now.end()) | 716 if (time_domain_now.find(time_domain) == time_domain_now.end()) |
| 709 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); | 717 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); |
| 710 queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks( | 718 queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks( |
| 711 time_domain_now[time_domain]); | 719 time_domain_now[time_domain]); |
| 712 } | 720 } |
| 713 } | 721 } |
| 714 | 722 |
| 715 } // namespace scheduler | 723 } // namespace scheduler |
| 716 } // namespace blink | 724 } // namespace blink |
| OLD | NEW |