Use IOService enumeration instead of IOHIDManager in HidServiceMac.
[chromium-blink-merge.git] / gin / isolate_holder.cc
blob740e13640a0ab40ebbc35df043906e96f8904b1e
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "gin/public/isolate_holder.h"
7 #include <stdlib.h>
8 #include <string.h>
10 #include "base/logging.h"
11 #include "base/message_loop/message_loop.h"
12 #include "base/rand_util.h"
13 #include "base/sys_info.h"
14 #include "gin/array_buffer.h"
15 #include "gin/debug_impl.h"
16 #include "gin/function_template.h"
17 #include "gin/per_isolate_data.h"
18 #include "gin/public/v8_platform.h"
19 #include "gin/run_microtasks_observer.h"
21 namespace gin {
23 namespace {
25 v8::ArrayBuffer::Allocator* g_array_buffer_allocator = NULL;
27 bool GenerateEntropy(unsigned char* buffer, size_t amount) {
28 base::RandBytes(buffer, amount);
29 return true;
32 } // namespace
34 IsolateHolder::IsolateHolder() {
35 CHECK(g_array_buffer_allocator)
36 << "You need to invoke gin::IsolateHolder::Initialize first";
37 v8::Isolate::CreateParams params;
38 params.entry_hook = DebugImpl::GetFunctionEntryHook();
39 params.code_event_handler = DebugImpl::GetJitCodeEventHandler();
40 params.constraints.ConfigureDefaults(base::SysInfo::AmountOfPhysicalMemory(),
41 base::SysInfo::AmountOfVirtualMemory(),
42 base::SysInfo::NumberOfProcessors());
43 isolate_ = v8::Isolate::New(params);
44 isolate_data_.reset(new PerIsolateData(isolate_, g_array_buffer_allocator));
45 #if defined(OS_WIN)
47 void* code_range;
48 size_t size;
49 isolate_->GetCodeRange(&code_range, &size);
50 Debug::CodeRangeCreatedCallback callback =
51 DebugImpl::GetCodeRangeCreatedCallback();
52 if (code_range && size && callback)
53 callback(code_range, size);
55 #endif
58 IsolateHolder::~IsolateHolder() {
59 if (task_observer_.get())
60 base::MessageLoop::current()->RemoveTaskObserver(task_observer_.get());
61 #if defined(OS_WIN)
63 void* code_range;
64 size_t size;
65 isolate_->GetCodeRange(&code_range, &size);
66 Debug::CodeRangeDeletedCallback callback =
67 DebugImpl::GetCodeRangeDeletedCallback();
68 if (code_range && callback)
69 callback(code_range);
71 #endif
72 isolate_data_.reset();
73 isolate_->Dispose();
76 // static
77 void IsolateHolder::Initialize(ScriptMode mode,
78 v8::ArrayBuffer::Allocator* allocator) {
79 CHECK(allocator);
80 static bool v8_is_initialized = false;
81 if (v8_is_initialized)
82 return;
83 v8::V8::InitializePlatform(V8Platform::Get());
84 v8::V8::SetArrayBufferAllocator(allocator);
85 g_array_buffer_allocator = allocator;
86 if (mode == gin::IsolateHolder::kStrictMode) {
87 static const char v8_flags[] = "--use_strict";
88 v8::V8::SetFlagsFromString(v8_flags, sizeof(v8_flags) - 1);
90 v8::V8::SetEntropySource(&GenerateEntropy);
91 v8::V8::Initialize();
92 v8_is_initialized = true;
95 void IsolateHolder::AddRunMicrotasksObserver() {
96 DCHECK(!task_observer_.get());
97 task_observer_.reset(new RunMicrotasksObserver(isolate_));;
98 base::MessageLoop::current()->AddTaskObserver(task_observer_.get());
101 void IsolateHolder::RemoveRunMicrotasksObserver() {
102 DCHECK(task_observer_.get());
103 base::MessageLoop::current()->RemoveTaskObserver(task_observer_.get());
104 task_observer_.reset();
107 } // namespace gin