0

[v8 Jobs]: Implement v8::Platform::PostJob in gin

Forwarding calls to base::PostJob and mapping priority.

Bug: 1012816
Change-Id: I5a56f38fcb4bb28dd89db9e50ddcba07312bdc69
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2036387
Reviewed-by: Jochen Eisinger <jochen@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Etienne Pierre-Doray <etiennep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#770121}
This commit is contained in:
Etienne Pierre-doray
2020-05-19 15:22:22 +00:00
committed by Commit Bot
parent 27d627a87b
commit 9caa721efb
3 changed files with 101 additions and 0 deletions

@ -34,6 +34,9 @@ class GIN_EXPORT V8Platform : public v8::Platform {
std::unique_ptr<v8::Task> task) override;
void CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
double delay_in_seconds) override;
std::unique_ptr<v8::JobHandle> PostJob(
v8::TaskPriority priority,
std::unique_ptr<v8::JobTask> job_task) override;
bool IdleTasksEnabled(v8::Isolate* isolate) override;
double MonotonicallyIncreasingTime() override;
double CurrentClockTimeMillis() override;

@ -17,6 +17,7 @@
#include "base/location.h"
#include "base/rand_util.h"
#include "base/system/sys_info.h"
#include "base/task/post_job.h"
#include "base/task/post_task.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool/thread_pool_instance.h"
@ -269,6 +270,47 @@ base::LazyInstance<PageAllocator>::Leaky g_page_allocator =
#endif // BUILDFLAG(USE_PARTITION_ALLOC)
class JobDelegateImpl : public v8::JobDelegate {
public:
explicit JobDelegateImpl(base::JobDelegate* delegate) : delegate_(delegate) {}
JobDelegateImpl() = default;
JobDelegateImpl(const JobDelegateImpl&) = delete;
JobDelegateImpl& operator=(const JobDelegateImpl&) = delete;
// v8::JobDelegate:
bool ShouldYield() override { return delegate_->ShouldYield(); }
void NotifyConcurrencyIncrease() override {
delegate_->NotifyConcurrencyIncrease();
}
private:
base::JobDelegate* delegate_;
};
class JobHandleImpl : public v8::JobHandle {
public:
JobHandleImpl(base::JobHandle handle, std::unique_ptr<v8::JobTask> job_task)
: handle_(std::move(handle)), job_task_(std::move(job_task)) {}
~JobHandleImpl() override = default;
JobHandleImpl(const JobHandleImpl&) = delete;
JobHandleImpl& operator=(const JobHandleImpl&) = delete;
// v8::JobHandle:
void NotifyConcurrencyIncrease() override {
handle_.NotifyConcurrencyIncrease();
}
void Join() override { handle_.Join(); }
void Cancel() override { handle_.Cancel(); }
bool IsRunning() override { return !!handle_; }
private:
base::JobHandle handle_;
std::unique_ptr<v8::JobTask> job_task_;
};
} // namespace
} // namespace gin
@ -441,6 +483,37 @@ void V8Platform::CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
base::TimeDelta::FromSecondsD(delay_in_seconds));
}
std::unique_ptr<v8::JobHandle> V8Platform::PostJob(
v8::TaskPriority priority,
std::unique_ptr<v8::JobTask> job_task) {
base::TaskTraits task_traits;
switch (priority) {
case v8::TaskPriority::kBestEffort:
task_traits = kLowPriorityTaskTraits;
break;
case v8::TaskPriority::kUserVisible:
task_traits = kDefaultTaskTraits;
break;
case v8::TaskPriority::kUserBlocking:
task_traits = kBlockingTaskTraits;
break;
}
auto handle = base::PostJob(
FROM_HERE, task_traits,
base::BindRepeating(
[](v8::JobTask* job_task, base::JobDelegate* delegate) {
JobDelegateImpl delegate_impl(delegate);
job_task->Run(&delegate_impl);
},
base::Unretained(job_task.get())),
base::BindRepeating(
[](v8::JobTask* job_task) { return job_task->GetMaxConcurrency(); },
base::Unretained(job_task.get())));
return std::make_unique<JobHandleImpl>(std::move(handle),
std::move(job_task));
}
bool V8Platform::IdleTasksEnabled(v8::Isolate* isolate) {
return PerIsolateData::From(isolate)->task_runner()->IdleTasksEnabled();
}

@ -4,6 +4,9 @@
#include "gin/public/v8_platform.h"
#include <atomic>
#include "base/test/task_environment.h"
#include "base/trace_event/trace_event.h"
#include "testing/gtest/include/gtest/gtest.h"
@ -62,4 +65,26 @@ TEST(V8PlatformTest, TraceStateObserverFired) {
ASSERT_EQ(0, test_observer.Disabled());
}
// Tests that PostJob runs a task and is done after Join.
TEST(V8PlatformTest, PostJobSimple) {
base::test::TaskEnvironment task_environment;
std::atomic_size_t num_tasks_to_run(4);
class Task : public v8::JobTask {
public:
explicit Task(std::atomic_size_t* num_tasks_to_run)
: num_tasks_to_run(num_tasks_to_run) {}
void Run(v8::JobDelegate* delegate) override { --(*num_tasks_to_run); }
size_t GetMaxConcurrency() const override { return *num_tasks_to_run; }
std::atomic_size_t* num_tasks_to_run;
};
auto handle =
V8Platform::Get()->PostJob(v8::TaskPriority::kUserVisible,
std::make_unique<Task>(&num_tasks_to_run));
EXPECT_TRUE(handle->IsRunning());
handle->Join();
EXPECT_FALSE(handle->IsRunning());
DCHECK_EQ(num_tasks_to_run, 0U);
}
} // namespace gin