// Copyright 2017 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 "gin/v8_foreground_task_runner_with_locker.h"

#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/time/time.h"
#include "v8/include/v8-locker.h"

namespace gin {

V8ForegroundTaskRunnerWithLocker::V8ForegroundTaskRunnerWithLocker(
    v8::Isolate* isolate,
    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
    : isolate_(isolate), task_runner_(std::move(task_runner)) {
  DCHECK(task_runner_);
}

V8ForegroundTaskRunnerWithLocker::~V8ForegroundTaskRunnerWithLocker() = default;

namespace {

void RunWithLocker(v8::Isolate* isolate, std::unique_ptr<v8::Task> task) {
  v8::Locker lock(isolate);
  task->Run();
}

class IdleTaskWithLocker : public v8::IdleTask {
 public:
  IdleTaskWithLocker(v8::Isolate* isolate, std::unique_ptr<v8::IdleTask> task)
      : isolate_(isolate), task_(std::move(task)) {}
  IdleTaskWithLocker(const IdleTaskWithLocker&) = delete;
  IdleTaskWithLocker& operator=(const IdleTaskWithLocker&) = delete;
  ~IdleTaskWithLocker() override = default;

  // v8::IdleTask implementation.
  void Run(double deadline_in_seconds) override {
    v8::Locker lock(isolate_);
    task_->Run(deadline_in_seconds);
  }

 private:
  raw_ptr<v8::Isolate> isolate_;
  std::unique_ptr<v8::IdleTask> task_;
};

}  // namespace

void V8ForegroundTaskRunnerWithLocker::PostTask(
    std::unique_ptr<v8::Task> task) {
  task_runner_->PostTask(
      FROM_HERE, base::BindOnce(RunWithLocker, base::Unretained(isolate_),
                                std::move(task)));
}

void V8ForegroundTaskRunnerWithLocker::PostNonNestableTask(
    std::unique_ptr<v8::Task> task) {
  task_runner_->PostNonNestableTask(
      FROM_HERE, base::BindOnce(RunWithLocker, base::Unretained(isolate_),
                                std::move(task)));
}

void V8ForegroundTaskRunnerWithLocker::PostDelayedTask(
    std::unique_ptr<v8::Task> task,
    double delay_in_seconds) {
  task_runner_->PostDelayedTask(
      FROM_HERE,
      base::BindOnce(RunWithLocker, base::Unretained(isolate_),
                     std::move(task)),
      base::Seconds(delay_in_seconds));
}

void V8ForegroundTaskRunnerWithLocker::PostIdleTask(
    std::unique_ptr<v8::IdleTask> task) {
  DCHECK(IdleTasksEnabled());
  idle_task_runner()->PostIdleTask(
      std::make_unique<IdleTaskWithLocker>(isolate_, std::move(task)));
}

bool V8ForegroundTaskRunnerWithLocker::NonNestableTasksEnabled() const {
  return true;
}

}  // namespace gin
