blob: 2d3a5a6e859758ee3a6a610e8065d281bbc572a5 [file] [log] [blame]
// 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "base/single_thread_task_runner.h"
#include "third_party/blink/public/platform/web_thread_type.h"
#include "third_party/blink/renderer/platform/scheduler/base/task_time_observer.h"
#include "third_party/blink/renderer/platform/scheduler/child/idle_canceled_delayed_task_sweeper.h"
#include "third_party/blink/renderer/platform/scheduler/child/idle_helper.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/util/task_duration_metric_reporter.h"
#include "third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h"
#include "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h"
#include "third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h"
namespace base {
namespace sequence_manager {
class TaskQueueManager;
}
} // namespace base
namespace blink {
namespace scheduler {
class WorkerSchedulerProxy;
class PLATFORM_EXPORT WorkerThreadScheduler
: public NonMainThreadSchedulerImpl,
public IdleHelper::Delegate,
public base::sequence_manager::TaskTimeObserver {
public:
WorkerThreadScheduler(
WebThreadType thread_type,
std::unique_ptr<base::sequence_manager::TaskQueueManager>
task_queue_manager,
WorkerSchedulerProxy* proxy);
~WorkerThreadScheduler() override;
// WebThreadScheduler implementation:
scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> V8TaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner() override;
scoped_refptr<base::SingleThreadTaskRunner> IPCTaskRunner() override;
bool ShouldYieldForHighPriorityWork() override;
bool CanExceedIdleDeadlineIfRequired() const override;
void AddTaskObserver(base::MessageLoop::TaskObserver* task_observer) override;
void RemoveTaskObserver(
base::MessageLoop::TaskObserver* task_observer) override;
void Shutdown() override;
// NonMainThreadSchedulerImpl implementation:
scoped_refptr<NonMainThreadTaskQueue> DefaultTaskQueue() override;
void OnTaskCompleted(NonMainThreadTaskQueue* worker_task_queue,
const base::sequence_manager::TaskQueue::Task& task,
base::TimeTicks start,
base::TimeTicks end,
base::Optional<base::TimeDelta> thread_time) override;
// TaskTimeObserver implementation:
void WillProcessTask(double start_time) override;
void DidProcessTask(double start_time, double end_time) override;
SchedulerHelper* GetSchedulerHelperForTesting();
base::TimeTicks CurrentIdleTaskDeadlineForTesting() const;
// Virtual for test.
virtual void OnThrottlingStateChanged(
FrameScheduler::ThrottlingState throttling_state);
FrameScheduler::ThrottlingState throttling_state() const {
return throttling_state_;
}
void RegisterWorkerScheduler(WorkerScheduler* worker_scheduler) override;
// Returns the control task queue. Tasks posted to this queue are executed
// with the highest priority. Care must be taken to avoid starvation of other
// task queues.
scoped_refptr<NonMainThreadTaskQueue> ControlTaskQueue();
protected:
// NonMainThreadScheduler implementation:
void InitImpl() override;
// IdleHelper::Delegate implementation:
bool CanEnterLongIdlePeriod(
base::TimeTicks now,
base::TimeDelta* next_long_idle_period_delay_out) override;
void IsNotQuiescent() override {}
void OnIdlePeriodStarted() override {}
void OnIdlePeriodEnded() override {}
void OnPendingTasksChanged(bool new_state) override {}
void CreateTaskQueueThrottler();
void SetCPUTimeBudgetPoolForTesting(CPUTimeBudgetPool* cpu_time_budget_pool);
private:
void MaybeStartLongIdlePeriod();
IdleHelper idle_helper_;
IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_;
ThreadLoadTracker load_tracker_;
bool initialized_;
base::TimeTicks thread_start_time_;
scoped_refptr<NonMainThreadTaskQueue> control_task_queue_;
scoped_refptr<base::SingleThreadTaskRunner> v8_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_;
FrameScheduler::ThrottlingState throttling_state_;
WorkerMetricsHelper worker_metrics_helper_;
scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
DISALLOW_COPY_AND_ASSIGN(WorkerThreadScheduler);
};
} // namespace scheduler
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_