[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:

committed by
Commit Bot

parent
27d627a87b
commit
9caa721efb
@ -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
|
||||
|
Reference in New Issue
Block a user