1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // 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
|