Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc |
| index 0ce5d151ecd893249c2ab48160e583439abf783f..3332cfe6dcc7b8dc749598aaf2491433ddd0c0b8 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc |
| @@ -8,12 +8,32 @@ |
| #include "base/metrics/histogram_macros.h" |
| #include "base/trace_event/trace_event.h" |
| #include "base/trace_event/trace_event_argument.h" |
| +#include "platform/scheduler/base/time_converter.h" |
| #include "platform/scheduler/child/scheduler_tqm_delegate.h" |
| #include "public/platform/scheduler/base/task_queue.h" |
| namespace blink { |
| namespace scheduler { |
| +namespace { |
| +// Workers could be short-lived, set a shorter interval than |
| +// the renderer thread. |
| +constexpr base::TimeDelta kWorkerThreadLoadTrackerReportingInterval = |
| + base::TimeDelta::FromSeconds(1); |
| +// Start reporting the load right away. |
| +constexpr base::TimeDelta kWorkerThreadLoadTrackerWaitingPeriodBeforeReporting = |
| + base::TimeDelta::FromSeconds(0); |
| + |
| +void ReportWorkerTaskLoad(base::TimeTicks time, double load) { |
| + int load_percentage = static_cast<int>(load * 100); |
| + DCHECK_LE(load_percentage, 100); |
| + // TODO(kinuko): Maybe we also want to separately log when the associated |
| + // tab is in foreground and when not. |
| + UMA_HISTOGRAM_PERCENTAGE("WorkerScheduler.WorkerThreadLoad", load_percentage); |
| +} |
| + |
| +} // namespace |
| + |
| WorkerSchedulerImpl::WorkerSchedulerImpl( |
| scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
| : helper_(main_task_runner, |
| @@ -28,9 +48,15 @@ WorkerSchedulerImpl::WorkerSchedulerImpl( |
| base::TimeDelta::FromMilliseconds(300)), |
| idle_canceled_delayed_task_sweeper_("worker.scheduler", |
| &helper_, |
| - idle_helper_.IdleTaskRunner()) { |
| + idle_helper_.IdleTaskRunner()), |
| + load_tracker_(helper_.scheduler_tqm_delegate()->NowTicks(), |
| + base::Bind(&ReportWorkerTaskLoad), |
| + kWorkerThreadLoadTrackerReportingInterval, |
| + kWorkerThreadLoadTrackerWaitingPeriodBeforeReporting) { |
| initialized_ = false; |
| thread_start_time_ = helper_.scheduler_tqm_delegate()->NowTicks(); |
| + load_tracker_.Resume(thread_start_time_); |
| + helper_.AddTaskTimeObserver(this); |
| TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
| TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); |
| } |
| @@ -38,6 +64,7 @@ WorkerSchedulerImpl::WorkerSchedulerImpl( |
| WorkerSchedulerImpl::~WorkerSchedulerImpl() { |
| TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
| TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); |
| + helper_.RemoveTaskTimeObserver(this); |
| } |
| void WorkerSchedulerImpl::Init() { |
| @@ -79,6 +106,7 @@ void WorkerSchedulerImpl::RemoveTaskObserver( |
| } |
| void WorkerSchedulerImpl::Shutdown() { |
| + load_tracker_.RecordIdle(helper_.scheduler_tqm_delegate()->NowTicks()); |
| DCHECK(initialized_); |
|
Sami
2017/04/03 13:56:22
nit: Please keep the DCHECK first.
kinuko
2017/04/03 23:23:47
Done.
|
| base::TimeTicks end_time = helper_.scheduler_tqm_delegate()->NowTicks(); |
| base::TimeDelta delta = end_time - thread_start_time_; |
| @@ -105,5 +133,18 @@ base::TimeTicks WorkerSchedulerImpl::CurrentIdleTaskDeadlineForTesting() const { |
| return idle_helper_.CurrentIdleTaskDeadline(); |
| } |
| +void WorkerSchedulerImpl::willProcessTask(TaskQueue* task_queue, |
| + double start_time) {} |
| + |
| +void WorkerSchedulerImpl::didProcessTask(TaskQueue* task_queue, |
| + double start_time, |
| + double end_time) { |
| + base::TimeTicks start_time_ticks = |
| + MonotonicTimeInSecondsToTimeTicks(start_time); |
| + base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); |
| + |
| + load_tracker_.RecordTaskTime(start_time_ticks, end_time_ticks); |
| +} |
| + |
| } // namespace scheduler |
| } // namespace blink |