// Copyright 2017 The Chromium Authors // 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 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 task) { v8::Locker lock(isolate); task->Run(); } class IdleTaskWithLocker : public v8::IdleTask { public: IdleTaskWithLocker(v8::Isolate* isolate, std::unique_ptr 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 isolate_; std::unique_ptr task_; }; } // namespace void V8ForegroundTaskRunnerWithLocker::PostTask( std::unique_ptr task) { task_runner_->PostTask( FROM_HERE, base::BindOnce(RunWithLocker, base::Unretained(isolate_), std::move(task))); } void V8ForegroundTaskRunnerWithLocker::PostNonNestableTask( std::unique_ptr task) { task_runner_->PostNonNestableTask( FROM_HERE, base::BindOnce(RunWithLocker, base::Unretained(isolate_), std::move(task))); } void V8ForegroundTaskRunnerWithLocker::PostDelayedTask( std::unique_ptr 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 task) { DCHECK(IdleTasksEnabled()); idle_task_runner()->PostIdleTask( std::make_unique(isolate_, std::move(task))); } bool V8ForegroundTaskRunnerWithLocker::NonNestableTasksEnabled() const { return true; } } // namespace gin