0

Use timer task runner for V8PerIsolate tasks

Per the effort of getting rid of default task queue in scheduler, post per-isolate
tasks to renderer-wide timer task queue.

BUG=676805

Review-Url: https://codereview.chromium.org/2589363003
Cr-Commit-Position: refs/heads/master@{#441114}
This commit is contained in:
altimin
2017-01-03 06:06:54 -08:00
committed by Commit bot
parent 9464d6f032
commit 124814c802
17 changed files with 63 additions and 31 deletions

@ -5,6 +5,7 @@
#include "extensions/renderer/api_binding_test.h"
#include "base/memory/ptr_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/context_holder.h"
#include "gin/public/isolate_holder.h"
@ -31,7 +32,8 @@ void APIBindingTest::SetUp() {
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
isolate_holder_ = base::MakeUnique<gin::IsolateHolder>();
isolate_holder_ =
base::MakeUnique<gin::IsolateHolder>(base::ThreadTaskRunnerHandle::Get());
isolate()->Enter();
v8::HandleScope handle_scope(isolate());

@ -27,10 +27,13 @@ namespace {
v8::ArrayBuffer::Allocator* g_array_buffer_allocator = nullptr;
} // namespace
IsolateHolder::IsolateHolder() : IsolateHolder(AccessMode::kSingleThread) {
}
IsolateHolder::IsolateHolder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: IsolateHolder(std::move(task_runner), AccessMode::kSingleThread) {}
IsolateHolder::IsolateHolder(AccessMode access_mode)
IsolateHolder::IsolateHolder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
AccessMode access_mode)
: access_mode_(access_mode) {
v8::ArrayBuffer::Allocator* allocator = g_array_buffer_allocator;
CHECK(allocator) << "You need to invoke gin::IsolateHolder::Initialize first";
@ -41,7 +44,8 @@ IsolateHolder::IsolateHolder(AccessMode access_mode)
base::SysInfo::AmountOfVirtualMemory());
params.array_buffer_allocator = allocator;
isolate_ = v8::Isolate::New(params);
isolate_data_.reset(new PerIsolateData(isolate_, allocator, access_mode));
isolate_data_.reset(
new PerIsolateData(isolate_, allocator, access_mode, task_runner));
isolate_memory_dump_provider_.reset(new V8IsolateMemoryDumpProvider(this));
#if defined(OS_WIN)
{

@ -21,13 +21,15 @@ using v8::ObjectTemplate;
namespace gin {
PerIsolateData::PerIsolateData(Isolate* isolate,
ArrayBuffer::Allocator* allocator,
IsolateHolder::AccessMode access_mode)
PerIsolateData::PerIsolateData(
Isolate* isolate,
ArrayBuffer::Allocator* allocator,
IsolateHolder::AccessMode access_mode,
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: isolate_(isolate),
allocator_(allocator),
access_mode_(access_mode),
task_runner_(base::ThreadTaskRunnerHandle::Get()) {
task_runner_(task_runner) {
isolate_->SetData(kEmbedderNativeGin, this);
}

@ -32,7 +32,8 @@ class GIN_EXPORT PerIsolateData {
public:
PerIsolateData(v8::Isolate* isolate,
v8::ArrayBuffer::Allocator* allocator,
IsolateHolder::AccessMode access_mode);
IsolateHolder::AccessMode access_mode,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~PerIsolateData();
static PerIsolateData* From(v8::Isolate* isolate);

@ -8,10 +8,15 @@
#include <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "gin/gin_export.h"
#include "gin/public/v8_idle_task_runner.h"
#include "v8/include/v8.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace gin {
class PerIsolateData;
@ -42,8 +47,10 @@ class GIN_EXPORT IsolateHolder {
kStableAndExperimentalV8Extras,
};
IsolateHolder();
explicit IsolateHolder(AccessMode access_mode);
explicit IsolateHolder(
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
IsolateHolder(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
AccessMode access_mode);
~IsolateHolder();
// Should be invoked once before creating IsolateHolder instances to

@ -80,8 +80,7 @@ int main(int argc, char** argv) {
gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
gin::IsolateHolder instance;
gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
gin::GinShellRunnerDelegate delegate;
gin::ShellRunner runner(&delegate, instance.isolate());

@ -6,6 +6,7 @@
#include "base/compiler_specific.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/converter.h"
#include "gin/public/isolate_holder.h"
@ -35,7 +36,7 @@ TEST(RunnerTest, Run) {
gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
gin::IsolateHolder instance;
gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
ShellRunnerDelegate delegate;
Isolate* isolate = instance.isolate();

@ -8,6 +8,7 @@
#include "base/message_loop/message_loop.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/converter.h"
#include "gin/modules/console.h"
@ -69,7 +70,7 @@ void RunTestFromFile(const base::FilePath& path, FileRunnerDelegate* delegate,
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
gin::IsolateHolder instance;
gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
gin::ShellRunner runner(delegate, instance.isolate());
{
gin::Runner::Scope scope(&runner);

@ -4,6 +4,7 @@
#include "gin/test/v8_test.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
#include "gin/v8_initializer.h"
@ -29,7 +30,7 @@ void V8Test::SetUp() {
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
instance_.reset(new gin::IsolateHolder);
instance_.reset(new gin::IsolateHolder(base::ThreadTaskRunnerHandle::Get()));
instance_->isolate()->Enter();
HandleScope handle_scope(instance_->isolate());
context_.Reset(instance_->isolate(), Context::New(instance_->isolate()));

@ -15,6 +15,7 @@
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
#include "gin/v8_initializer.h"
@ -404,7 +405,7 @@ class JsToCppTest : public testing::Test {
gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
gin::IsolateHolder instance;
gin::IsolateHolder instance(base::ThreadTaskRunnerHandle::Get());
MojoRunnerDelegate delegate;
gin::ShellRunner runner(&delegate, instance.isolate());
delegate.Start(&runner, js_side_proxy.PassMessagePipe().release().value(),

@ -18,6 +18,7 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/lock.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
#include "gin/v8_initializer.h"
@ -391,7 +392,8 @@ class SharedIsolateFactory {
has_initialized_v8_ = true;
}
holder_.reset(new gin::IsolateHolder(gin::IsolateHolder::kUseLocker));
holder_.reset(new gin::IsolateHolder(base::ThreadTaskRunnerHandle::Get(),
gin::IsolateHolder::kUseLocker));
}
return holder_->isolate();

@ -25,6 +25,7 @@
#include "base/strings/string_piece.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/gin_embedders.h"
#include "gin/public/isolate_holder.h"
@ -607,8 +608,8 @@ void SetUpV8() {
gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
gin::IsolateHolder::kStableV8Extras,
gin::ArrayBufferAllocator::SharedInstance());
g_isolate_holder =
new gin::IsolateHolder(gin::IsolateHolder::kSingleThread);
g_isolate_holder = new gin::IsolateHolder(base::ThreadTaskRunnerHandle::Get(),
gin::IsolateHolder::kSingleThread);
g_isolate_holder->isolate()->Enter();
}

@ -392,7 +392,9 @@ void V8Initializer::initializeMainThread() {
gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
v8ExtrasMode, &arrayBufferAllocator);
v8::Isolate* isolate = V8PerIsolateData::initialize();
WebScheduler* scheduler = Platform::current()->currentThread()->scheduler();
v8::Isolate* isolate =
V8PerIsolateData::initialize(scheduler->timerTaskRunner());
initializeV8Common(isolate);
@ -409,7 +411,6 @@ void V8Initializer::initializeMainThread() {
codeGenerationCheckCallbackInMainThread);
if (RuntimeEnabledFeatures::v8IdleTasksEnabled()) {
WebScheduler* scheduler = Platform::current()->currentThread()->scheduler();
V8PerIsolateData::enableIdleTasks(
isolate, WTF::makeUnique<V8IdleTaskRunner>(scheduler));
}

@ -53,8 +53,9 @@ static void microtasksCompletedCallback(v8::Isolate* isolate) {
V8PerIsolateData::from(isolate)->runEndOfScopeTasks();
}
V8PerIsolateData::V8PerIsolateData()
: m_isolateHolder(WTF::makeUnique<gin::IsolateHolder>()),
V8PerIsolateData::V8PerIsolateData(WebTaskRunner* taskRunner)
: m_isolateHolder(WTF::makeUnique<gin::IsolateHolder>(
taskRunner->toSingleThreadTaskRunner())),
m_stringCache(WTF::wrapUnique(new StringCache(isolate()))),
m_hiddenValue(V8HiddenValue::create()),
m_privateProperty(V8PrivateProperty::create()),
@ -78,8 +79,8 @@ v8::Isolate* V8PerIsolateData::mainThreadIsolate() {
return mainThreadPerIsolateData->isolate();
}
v8::Isolate* V8PerIsolateData::initialize() {
V8PerIsolateData* data = new V8PerIsolateData();
v8::Isolate* V8PerIsolateData::initialize(WebTaskRunner* taskRunner) {
V8PerIsolateData* data = new V8PerIsolateData(taskRunner);
v8::Isolate* isolate = data->isolate();
isolate->SetData(gin::kEmbedderBlink, data);
return isolate;

@ -48,6 +48,7 @@ class DOMDataStore;
class StringCache;
class ThreadDebugger;
class V8PrivateProperty;
class WebTaskRunner;
struct WrapperTypeInfo;
typedef WTF::Vector<DOMDataStore*> DOMDataStoreList;
@ -89,7 +90,7 @@ class CORE_EXPORT V8PerIsolateData {
const bool m_originalUseCounterDisabled;
};
static v8::Isolate* initialize();
static v8::Isolate* initialize(WebTaskRunner*);
static V8PerIsolateData* from(v8::Isolate* isolate) {
ASSERT(isolate);
@ -175,7 +176,7 @@ class CORE_EXPORT V8PerIsolateData {
}
private:
V8PerIsolateData();
explicit V8PerIsolateData(WebTaskRunner*);
~V8PerIsolateData();
static void useCounterCallback(v8::Isolate*, v8::Isolate::UseCounterFeature);

@ -64,7 +64,8 @@ WorkerBackingThread::~WorkerBackingThread() {}
void WorkerBackingThread::initialize() {
DCHECK(!m_isolate);
m_backingThread->initialize();
m_isolate = V8PerIsolateData::initialize();
m_isolate = V8PerIsolateData::initialize(
m_backingThread->platformThread().getWebTaskRunner());
addWorkerIsolate(m_isolate);
V8Initializer::initializeWorker(m_isolate);

@ -5,6 +5,7 @@
#include "modules/fetch/DataConsumerHandleTestUtil.h"
#include "bindings/core/v8/DOMWrapperWorld.h"
#include "public/platform/WebScheduler.h"
#include "wtf/PtrUtil.h"
#include <memory>
@ -58,7 +59,12 @@ DataConsumerHandleTestUtil::Thread::~Thread() {
void DataConsumerHandleTestUtil::Thread::initialize() {
if (m_initializationPolicy >= ScriptExecution) {
m_isolateHolder = WTF::makeUnique<gin::IsolateHolder>();
m_isolateHolder =
WTF::makeUnique<gin::IsolateHolder>(Platform::current()
->currentThread()
->scheduler()
->loadingTaskRunner()
->toSingleThreadTaskRunner());
isolate()->Enter();
}
m_thread->initialize();