// 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_WEBKIT_SOURCE_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_
#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_

#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/single_thread_task_runner.h"
#include "platform/scheduler/base/task_time_observer.h"
#include "platform/scheduler/child/idle_canceled_delayed_task_sweeper.h"
#include "platform/scheduler/child/idle_helper.h"
#include "platform/scheduler/child/worker_metrics_helper.h"
#include "platform/scheduler/public/frame_scheduler.h"
#include "platform/scheduler/public/non_main_thread_scheduler.h"
#include "platform/scheduler/util/task_duration_metric_reporter.h"
#include "platform/scheduler/util/thread_load_tracker.h"
#include "public/platform/WebThreadType.h"

namespace blink {
namespace scheduler {

class TaskQueueManager;
class WorkerSchedulerProxy;

// TODO(yutak): Rename this class to WorkerThreadScheduler.
class PLATFORM_EXPORT WorkerSchedulerImpl : public WorkerScheduler,
                                            public IdleHelper::Delegate,
                                            public TaskTimeObserver {
 public:
  WorkerSchedulerImpl(WebThreadType thread_type,
                      std::unique_ptr<TaskQueueManager> task_queue_manager,
                      WorkerSchedulerProxy* proxy);
  ~WorkerSchedulerImpl() override;

  // ChildScheduler implementation:
  scoped_refptr<base::SingleThreadTaskRunner> DefaultTaskRunner() override;
  scoped_refptr<SingleThreadIdleTaskRunner> IdleTaskRunner() 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;

  // WorkerScheduler implementation:
  scoped_refptr<WorkerTaskQueue> DefaultTaskQueue() override;
  void Init() override;
  void OnTaskCompleted(WorkerTaskQueue* worker_task_queue,
                       const 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);

  // 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<WorkerTaskQueue> ControlTaskQueue();

 protected:
  // 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 {}

  FrameScheduler::ThrottlingState throttling_state() const {
    return throttling_state_;
  }

 private:
  void MaybeStartLongIdlePeriod();

  base::WeakPtr<WorkerSchedulerImpl> GetWeakPtr();

  IdleHelper idle_helper_;
  IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_;
  ThreadLoadTracker load_tracker_;
  bool initialized_;
  base::TimeTicks thread_start_time_;
  scoped_refptr<WorkerTaskQueue> control_task_queue_;
  FrameScheduler::ThrottlingState throttling_state_;

  WorkerMetricsHelper worker_metrics_helper_;

  base::WeakPtrFactory<WorkerSchedulerImpl> weak_factory_;

  DISALLOW_COPY_AND_ASSIGN(WorkerSchedulerImpl);
};

}  // namespace scheduler
}  // namespace blink

#endif  // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_WORKER_WORKER_THREAD_SCHEDULER_H_
