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 |