// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/scheduler/child/web_scheduler_impl.h" #include "base/bind.h" #include "base/single_thread_task_runner.h" #include "components/scheduler/child/worker_scheduler.h" #include "third_party/WebKit/public/platform/WebTraceLocation.h" namespace scheduler { WebSchedulerImpl::WebSchedulerImpl( ChildScheduler* child_scheduler, scoped_refptr idle_task_runner, scoped_refptr loading_task_runner, scoped_refptr timer_task_runner) : child_scheduler_(child_scheduler), idle_task_runner_(idle_task_runner), loading_task_runner_(loading_task_runner), timer_task_runner_(timer_task_runner) {} WebSchedulerImpl::~WebSchedulerImpl() { } void WebSchedulerImpl::shutdown() { child_scheduler_->Shutdown(); } bool WebSchedulerImpl::shouldYieldForHighPriorityWork() { return child_scheduler_->ShouldYieldForHighPriorityWork(); } bool WebSchedulerImpl::canExceedIdleDeadlineIfRequired() { return child_scheduler_->CanExceedIdleDeadlineIfRequired(); } void WebSchedulerImpl::runIdleTask(scoped_ptr task, base::TimeTicks deadline) { task->run((deadline - base::TimeTicks()).InSecondsF()); } void WebSchedulerImpl::runTask(scoped_ptr task) { task->run(); } void WebSchedulerImpl::postIdleTask(const blink::WebTraceLocation& web_location, blink::WebThread::IdleTask* task) { DCHECK(idle_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); idle_task_runner_->PostIdleTask( location, base::Bind(&WebSchedulerImpl::runIdleTask, base::Passed(&scoped_task))); } void WebSchedulerImpl::postNonNestableIdleTask( const blink::WebTraceLocation& web_location, blink::WebThread::IdleTask* task) { DCHECK(idle_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); idle_task_runner_->PostNonNestableIdleTask( location, base::Bind(&WebSchedulerImpl::runIdleTask, base::Passed(&scoped_task))); } void WebSchedulerImpl::postIdleTaskAfterWakeup( const blink::WebTraceLocation& web_location, blink::WebThread::IdleTask* task) { DCHECK(idle_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); idle_task_runner_->PostIdleTaskAfterWakeup( location, base::Bind(&WebSchedulerImpl::runIdleTask, base::Passed(&scoped_task))); } void WebSchedulerImpl::postLoadingTask( const blink::WebTraceLocation& web_location, blink::WebThread::Task* task) { DCHECK(loading_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); loading_task_runner_->PostTask( location, base::Bind(&WebSchedulerImpl::runTask, base::Passed(&scoped_task))); } void WebSchedulerImpl::postTimerTask( const blink::WebTraceLocation& web_location, blink::WebThread::Task* task, long long delayMs) { DCHECK(timer_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); timer_task_runner_->PostDelayedTask( location, base::Bind(&WebSchedulerImpl::runTask, base::Passed(&scoped_task)), base::TimeDelta::FromMilliseconds(delayMs)); } void WebSchedulerImpl::postTimerTask( const blink::WebTraceLocation& web_location, blink::WebThread::Task* task, double delaySecs) { DCHECK(timer_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); timer_task_runner_->PostDelayedTask( location, base::Bind(&WebSchedulerImpl::runTask, base::Passed(&scoped_task)), base::TimeDelta::FromSecondsD(delaySecs)); } void WebSchedulerImpl::postTimerTaskAt( const blink::WebTraceLocation& web_location, blink::WebThread::Task* task, double monotonicTime) { DCHECK(timer_task_runner_); scoped_ptr scoped_task(task); tracked_objects::Location location(web_location.functionName(), web_location.fileName(), -1, nullptr); timer_task_runner_->PostDelayedTaskAt( location, base::Bind(&WebSchedulerImpl::runTask, base::Passed(&scoped_task)), base::TimeTicks() + base::TimeDelta::FromSecondsD(monotonicTime)); } } // namespace scheduler