[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;
|
std::unique_ptr<v8::Task> task) override;
|
||||||
void CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
|
void CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
|
||||||
double delay_in_seconds) override;
|
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;
|
bool IdleTasksEnabled(v8::Isolate* isolate) override;
|
||||||
double MonotonicallyIncreasingTime() override;
|
double MonotonicallyIncreasingTime() override;
|
||||||
double CurrentClockTimeMillis() override;
|
double CurrentClockTimeMillis() override;
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "base/location.h"
|
#include "base/location.h"
|
||||||
#include "base/rand_util.h"
|
#include "base/rand_util.h"
|
||||||
#include "base/system/sys_info.h"
|
#include "base/system/sys_info.h"
|
||||||
|
#include "base/task/post_job.h"
|
||||||
#include "base/task/post_task.h"
|
#include "base/task/post_task.h"
|
||||||
#include "base/task/task_traits.h"
|
#include "base/task/task_traits.h"
|
||||||
#include "base/task/thread_pool/thread_pool_instance.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)
|
#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
|
||||||
|
|
||||||
} // namespace gin
|
} // namespace gin
|
||||||
@ -441,6 +483,37 @@ void V8Platform::CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
|
|||||||
base::TimeDelta::FromSecondsD(delay_in_seconds));
|
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) {
|
bool V8Platform::IdleTasksEnabled(v8::Isolate* isolate) {
|
||||||
return PerIsolateData::From(isolate)->task_runner()->IdleTasksEnabled();
|
return PerIsolateData::From(isolate)->task_runner()->IdleTasksEnabled();
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include "gin/public/v8_platform.h"
|
#include "gin/public/v8_platform.h"
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
#include "base/test/task_environment.h"
|
||||||
#include "base/trace_event/trace_event.h"
|
#include "base/trace_event/trace_event.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
|
||||||
@ -62,4 +65,26 @@ TEST(V8PlatformTest, TraceStateObserverFired) {
|
|||||||
ASSERT_EQ(0, test_observer.Disabled());
|
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
|
} // namespace gin
|
||||||
|
Reference in New Issue
Block a user