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 | 20 |
21 static const double kLongTaskTraceEventThreshold = 0.05; | |
22 | |
21 namespace blink { | 23 namespace blink { |
22 namespace scheduler { | 24 namespace scheduler { |
23 | 25 |
24 namespace { | 26 namespace { |
25 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; | 27 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; |
26 | 28 |
27 void RecordDelayedTaskLateness(base::TimeDelta lateness) { | 29 void RecordDelayedTaskLateness(base::TimeDelta lateness) { |
28 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", | 30 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", |
29 lateness); | 31 lateness); |
30 } | 32 } |
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
529 currently_executing_task_queue_; | 531 currently_executing_task_queue_; |
530 currently_executing_task_queue_ = queue; | 532 currently_executing_task_queue_ = queue; |
531 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); | 533 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); |
532 // Detect if the TaskQueueManager just got deleted. If this happens we must | 534 // Detect if the TaskQueueManager just got deleted. If this happens we must |
533 // not access any member variables after this point. | 535 // not access any member variables after this point. |
534 if (protect->HasOneRef()) | 536 if (protect->HasOneRef()) |
535 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; | 537 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; |
536 | 538 |
537 currently_executing_task_queue_ = prev_executing_task_queue; | 539 currently_executing_task_queue_ = prev_executing_task_queue; |
538 | 540 |
539 | 541 double task_end_time = 0; |
540 if (queue->GetShouldNotifyObservers()) { | 542 if (queue->GetShouldNotifyObservers()) { |
541 if (task_start_time) { | 543 if (task_start_time) { |
542 *time_after_task = real_time_domain()->Now(); | 544 *time_after_task = real_time_domain()->Now(); |
543 double task_end_time = MonotonicTimeInSeconds(*time_after_task); | 545 task_end_time = MonotonicTimeInSeconds(*time_after_task); |
544 for (auto& observer : task_time_observers_) | 546 for (auto& observer : task_time_observers_) |
545 observer.DidProcessTask(queue, task_start_time, task_end_time); | 547 observer.DidProcessTask(queue, task_start_time, task_end_time); |
546 } | 548 } |
547 | 549 |
548 for (auto& observer : task_observers_) | 550 for (auto& observer : task_observers_) |
549 observer.DidProcessTask(pending_task); | 551 observer.DidProcessTask(pending_task); |
550 queue->NotifyDidProcessTask(pending_task); | 552 queue->NotifyDidProcessTask(pending_task); |
551 } | 553 } |
552 | 554 |
555 if (task_start_time && task_end_time && | |
556 task_end_time - task_start_time > kLongTaskTraceEventThreshold) { | |
557 TRACE_EVENT2("blink", "LongTask", "start_time", task_start_time, "end_time", | |
altimin
2017/07/07 18:24:17
This will be shown in the UI as an extremely short
caseq
2017/07/07 18:54:44
+1 to this, I don't think it makes sense in the pr
Liquan (Max) Gu
2017/07/07 20:01:25
I have changed to emit an instant event.
From th
| |
558 task_end_time); | |
559 } | |
560 | |
553 return ProcessTaskResult::EXECUTED; | 561 return ProcessTaskResult::EXECUTED; |
554 } | 562 } |
555 | 563 |
556 void TaskQueueManager::MaybeRecordTaskDelayHistograms( | 564 void TaskQueueManager::MaybeRecordTaskDelayHistograms( |
557 const internal::TaskQueueImpl::Task& pending_task, | 565 const internal::TaskQueueImpl::Task& pending_task, |
558 const internal::TaskQueueImpl* queue) { | 566 const internal::TaskQueueImpl* queue) { |
559 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) | 567 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) |
560 return; | 568 return; |
561 | 569 |
562 // Record delayed task lateness and immediate task queuing durations. | 570 // Record delayed task lateness and immediate task queuing durations. |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { | 712 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { |
705 TimeDomain* time_domain = queue->GetTimeDomain(); | 713 TimeDomain* time_domain = queue->GetTimeDomain(); |
706 if (time_domain_now.find(time_domain) == time_domain_now.end()) | 714 if (time_domain_now.find(time_domain) == time_domain_now.end()) |
707 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); | 715 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); |
708 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); | 716 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); |
709 } | 717 } |
710 } | 718 } |
711 | 719 |
712 } // namespace scheduler | 720 } // namespace scheduler |
713 } // namespace blink | 721 } // namespace blink |
OLD | NEW |