// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_
#define GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_

#include "base/memory/raw_ref.h"
#include "base/synchronization/lock.h"
#include "base/task/sequenced_task_runner.h"
#include "gpu/command_buffer/service/gpu_command_buffer_service_export.h"
#include "gpu/command_buffer/service/sequence_id.h"

namespace gpu {

class Scheduler;

// A SequencedTaskRunner implementation to abstract task execution for a
// specific SequenceId on the GPU Scheduler. This object does not support
// delayed tasks, because the underlying Scheduler implementation does not
// support scheduling delayed tasks. Also note that tasks run by this object do
// not support running nested RunLoops.
class GPU_COMMAND_BUFFER_SERVICE_EXPORT SchedulerTaskRunner
    : public base::SequencedTaskRunner {
 public:
  // Constructs a SchedulerTaskRunner that runs tasks on `scheduler`, on the
  // sequence identified by `sequence_id`. This instance must not outlive
  // `scheduler`.
  SchedulerTaskRunner(Scheduler& scheduler, SequenceId sequence_id);

  // Once this is called, all subsequent tasks will be rejected.
  void ShutDown();

  // base::SequencedTaskRunner:
  bool PostDelayedTask(const base::Location& from_here,
                       base::OnceClosure task,
                       base::TimeDelta delay) override;
  bool PostNonNestableDelayedTask(const base::Location& from_here,
                                  base::OnceClosure task,
                                  base::TimeDelta delay) override;
  bool RunsTasksInCurrentSequence() const override;

 private:
  ~SchedulerTaskRunner() override;

  void RunTask(base::OnceClosure task);

  const raw_ref<Scheduler> scheduler_;
  const SequenceId sequence_id_;

  base::Lock lock_;
  bool is_running_ GUARDED_BY(lock_) = true;
};

}  // namespace gpu

#endif  // GPU_COMMAND_BUFFER_SERVICE_SCHEDULER_TASK_RUNNER_H_
