// 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/bind_helpers.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "v8/include/v8.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() override = default;

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

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

  DISALLOW_COPY_AND_ASSIGN(IdleTaskWithLocker);
};

}  // 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::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::TimeDelta::FromSecondsD(delay_in_seconds));
}

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

}  // namespace gin
